• 25-07-2023, 17:00:38
    #1
    Selam dostlar. Aşama aşama kodlarımı 2 dosyaya indirgedim. Bu 2 sayaç kodundan hangisi daha stabil? (PHP)
    Teşekkür ederim.

    <?php // KOD 1
    // json dosyasını oku
    $json = file_get_contents("visitors.json");
    // json verisini php dizisine dönüştür
    $data = json_decode($json, true);
    // ziyaretçiler dizisini al
    $visitors = $data["visitors"];
    // ziyaretçinin ip adresini al
    $ip = $_SERVER["REMOTE_ADDR"];
    // bugünün tarihini al
    $today = date("Y-m-d");
    // dünün tarihini al
    $yesterday = date("Y-m-d", strtotime("-1 day"));
    // ziyaretçinin dizide olup olmadığını kontrol etmek için bir bayrak
    $found = false;
    // ziyaretçiler dizisini döngüye sok
    foreach ($visitors as $key => $visitor) {
      // eğer ip adresi eşleşirse
      if ($visitor["ip"] == $ip) {
        // bayrağı true yap
        $found = true;
        // eğer tarih bugün ise
        if ($visitor["date"] == $today) {
          // görüntülenen sayfa sayısını artır
          $visitors[$key]["views"]++;
        // eğer tarih dün ise
        } elseif ($visitor["date"] == $yesterday) {
          // görüntülenen sayfa sayısını sıfırla ve tarihi güncelle
          $visitors[$key]["views"] = 1;
          $visitors[$key]["date"] = $today;
        // eğer tarih daha önceki bir gün ise
        } else {
          // ziyaretçiyi diziden sil ve yeni bir kayıt ekle
          unset($visitors[$key]);
          $visitors[] = array(
            "ip" => $ip,
            "date" => $today,
            "views" => 1
          );
        }
        // döngüden çık
        break;
      }
    }
    // eğer ziyaretçi bulunamazsa, yeni bir kayıt ekle
    if (!$found) {
      $visitors[] = array(
        "ip" => $ip,
        "date" => $today,
        "views" => 1
      );
    }
    // ziyaretçiler dizisini json verisine dönüştür
    $json = json_encode(array("visitors" => $visitors));
    // json verisini dosyaya yaz
    file_put_contents("visitors.json", $json);
    // bugünün, dünün ve tüm zamanların ziyaretçi sayısını tutacak değişkenler
    $today_visitors = 0;
    $yesterday_visitors = 0;
    $all_time_visitors = 0;
    // ziyaretçiler dizisini döngüye sok
    foreach ($visitors as $visitor) {
      // eğer tarih bugün ise
      if ($visitor["date"] == $today) {
        // bugünün ziyaretçi sayısını artır
        $today_visitors++;
      // eğer tarih dün ise
      } elseif ($visitor["date"] == $yesterday) {
        // dünün ziyaretçi sayısını artır
        $yesterday_visitors++;
      }
      // tüm zamanların ziyaretçi sayısını artır
      $all_time_visitors++;
    }
    /* <div class="counter">
      <p>Bugün: <?php echo $today_visitors; ?> ziyaretçi</p>
      <p>Dün: <?php echo $yesterday_visitors; ?> ziyaretçi</p>
      <p>Tüm zamanlar: <?php echo $all_time_visitors; ?> ziyaretçi</p>
    </div>
    */
    ?>
    <?php // KOD 2
    // JSON dosyasının adı ve yolu
    $file = "counter.json";
    
    // JSON dosyasını oku
    $data = json_decode(file_get_contents($file), true);
    
    // Bugünün tarihini al
    $today = date("Y-m-d");
    
    // Dünün tarihini al
    $yesterday = date("Y-m-d", strtotime("-1 day"));
    
    // Ziyaretçinin IP adresini al
    $ip = $_SERVER["REMOTE_ADDR"];
    
    // Bugün için ziyaretçi sayısını artır
    if (!isset($data[$today])) {
        // Bugün için yeni bir kayıt oluştur
        $data[$today] = array(
            "count" => 1,
            "ips" => array($ip)
        );
    } else {
        // Bugün için zaten bir kayıt varsa
        if (!in_array($ip, $data[$today]["ips"])) {
            // Ziyaretçi sayısını ve IP listesini güncelle
            $data[$today]["count"]++;
            $data[$today]["ips"][] = $ip;
        }
    }
    
    // Dün için ziyaretçi sayısını al
    if (!isset($data[$yesterday])) {
        // Dün için kayıt yoksa sıfır olarak ayarla
        $yesterday_count = 0;
    } else {
        // Dün için kayıt varsa sayıyı al
        $yesterday_count = $data[$yesterday]["count"];
    }
    
    // Tüm zamanlar için ziyaretçi sayısını al
    $total_count = 0;
    foreach ($data as $date => $value) {
        // Tüm tarihlerdeki ziyaretçi sayılarını topla
        $total_count += $value["count"];
    }
    
    // JSON dosyasını güncelle
    file_put_contents($file, json_encode($data));
    
    // Sayaç bilgilerini ekrana yazdır
    /*  echo "Bugün: " . $data[$today]["count"] . "<br>";
    echo "Dün: " . $yesterday_count . "<br>";
    echo "Toplam: " . $total_count . "<br>"; */
    ?>
    Aşağıdaki kod ise stabil çalışıyor gibi görünüyor. Bu kodu bugün ekledim. Dolayısıyla ertesi gün bugünün verisini düne aktaracak mı, göreceğiz.
    <?php // KOD 3: STABİL
    
    // ziyaretçinin IP adresini ve tarihini al 
    $ip = $_SERVER["REMOTE_ADDR"]; $date = date("Y-m-d");
    
    // json dosyasına yaz
    function write_json($ip, $date) { 
    
    // json dosyasını oku 
    $json_file = "visitors.json"; $json_data = file_get_contents ($json_file); $data = json_decode ($json_data, true);
    
    // yeni ziyaretçi verisini oluştur 
    $visitor = array( "ip" => $ip, "date" => $date );
    
    // veriyi json dosyasına ekleme öncesi kontrol et
    $exists = false; // ziyaretçinin var olup olmadığını tutacak bir değişken
    foreach ($data as $item) { // verileri döngüye sok
      if ($item["ip"] == $ip && $item["date"] == $date) { // ip ve date değerleri eşleşiyorsa
        $exists = true; // ziyaretçi zaten var
        break; // döngüden çık
      }
    }
    
    if (!$exists) { // ziyaretçi yoksa
      $data[] = $visitor; // veriyi json dosyasına ekle
      $json_data = json_encode ($data, JSON_PRETTY_PRINT); file_put_contents ($json_file, $json_data); 
    }
    
    }
    
    write_json($ip, $date);
    
    function count_unique($period) { 
    
    // json dosyasını oku
    $json_file = "visitors.json"; 
    
    $json_data = file_get_contents($json_file); 
    $data = json_decode($json_data, true);
    
    // tekil ziyaretçileri tutacak bir dizi oluştur 
    $unique = array();
    
    // bugünün tarihini al 
    $today = date("Y-m-d");
    
    // dünün tarihini al 
    $yesterday = date("Y-m-d", strtotime("-1 day"));
    
    // verileri döngüye sok 
    foreach ($data as $visitor) { // ziyaretçinin IP adresini ve tarihini al 
    $ip = $visitor["ip"]; $date = $visitor["date"];
    
    // tarih aralığına göre kontrol et
    if ($period == "today" && $date == $today) {
      // bugünün tekil ziyaretçilerine ekle
      if (!in_array($ip, $unique)) {
        $unique[] = $ip;
      }
    } elseif ($period == "yesterday" && $date == $yesterday) {
      // dünün tekil ziyaretçilerine ekle
      if (!in_array($ip, $unique)) {
        $unique[] = $ip;
      }
    } elseif ($period == "all") {
      // tüm zamanların tekil ziyaretçilerine ekle
      if (!in_array($ip, $unique)) {
        $unique[] = $ip;
      }
    }
    }
    
    // tekil ziyaretçi sayısını döndür
    return count($unique); 
    }
    
    // tekil ziyaretçi sayılarını hesapla 
    $today_unique = count_unique("today"); 
    $yesterday_unique = count_unique("yesterday"); 
    $all_unique = count_unique("all");
    
    // web sayfasında göster 
    /* echo "<p>Bugün: <strong>$today_unique</strong> tekil ziyaretçi</p>"; 
    echo "<p>Dün: <strong>$yesterday_unique</strong> tekil ziyaretçi</p>"; 
    echo "<p>Tüm zamanlar: <strong>$all_unique</strong> tekil ziyaretçi</p>"; */
    ?>
  • 26-07-2023, 08:22:36
    #2
    json dosyasının boyutu ram ınızdan daha fazla olduğunda ne yapmayı planlıyorsunuz
  • 26-07-2023, 14:24:53
    #3
    trgino adlı üyeden alıntı: mesajı görüntüle
    json dosyasının boyutu ram ınızdan daha fazla olduğunda ne yapmayı planlıyorsunuz
    Hocam ben de biliyorum json dosyam şişecek ancak ne yapmalıyım pek bir fikrim yok, sizin öneriniz nedir?
  • 26-07-2023, 18:43:42
    #4
    trgino adlı üyeden alıntı: mesajı görüntüle
    json dosyasının boyutu ram ınızdan daha fazla olduğunda ne yapmayı planlıyorsunuz
    Son yazdığım kodu arşivleme yöntemi ile Bing Sohbetten istedim. Yine tekil ziyaretçi ancak dosya her 1 MB olduğunda arşivlenip yeni dosyaya geçilsin istedim. Gerçek sonucu 1 MB dolunca ne yaptığını görerek öğreneceğim. Umarım işime (işinize) yarar. Gelen yanıt şöyle oldu:
    <?php 
    // json dosyasının boyutunu veya son değiştirilme tarihini kontrol eden fonksiyon
    function check_json_file($json_file) {
    // json dosyasının boyutunu al (byte cinsinden) 
    $size = filesize($json_file);
    
    // json dosyasının son değiştirilme tarihini al (unix zaman damgası cinsinden) 
    $mtime = filemtime($json_file);
    
    // bugünün başlangıcını al (unix zaman damgası cinsinden) 
    $today = strtotime("today");
    
    // json dosyasının boyutu 1 MB’dan büyükse veya son değiştirilme tarihi bugünden önceyse 
    if ($size > 1024 * 1024 || $mtime < $today) {
    
    // json dosyasını yeni bir isimle kaydet // yeni isim, eski ismin sonuna dünün tarihi eklenerek oluşturulur 
    $new_name = $json_file . "_" . date("Y-m-d", strtotime("yesterday")); 
    rename($json_file, $new_name);
    
    // yeni bir boş json dosyası oluştur 
    $data = array(); 
    $json_data = json_encode($data, JSON_PRETTY_PRINT); 
    file_put_contents($json_file, $json_data); } }
    
    // ziyaretçinin IP adresini ve tarihini al 
    $ip = $_SERVER["REMOTE_ADDR"]; $date = date("Y-m-d");
    
    // json dosyasına yaz 
    function write_json($ip, $date) {
    
    // json dosyasını oku 
    $json_file = "visitors.json"; 
    $json_data = file_get_contents ($json_file); 
    $data = json_decode ($json_data, true);
    
    // yeni ziyaretçi verisini oluştur 
    $visitor = array( "ip" => $ip, "date" => $date );
    
    // veriyi json dosyasına ekleme öncesi kontrol et 
    $exists = false;
    
    // ziyaretçinin var olup olmadığını tutacak bir değişken 
    foreach ($data as $item) {
    
    // verileri döngüye sok 
    if ($item["ip"] == $ip && $item["date"] == $date) {
    // ip ve date değerleri eşleşiyorsa 
    $exists = true; 
    // ziyaretçi zaten var 
    break; // döngüden çık 
    } }
    
    if (!$exists) {
    
    // ziyaretçi yoksa 
    $data[] = $visitor;
    
    // veriyi json dosyasına ekle 
    $json_data = json_encode ($data, JSON_PRETTY_PRINT); 
    file_put_contents ($json_file, $json_data); }
    
    // json dosyasını kontrol et ve gerekirse arşivle 
    check_json_file($json_file);
    
    }
    
    write_json($ip, $date);
    
    function count_all_unique() {
    
    // json dosyasını oku 
    $json_file = "visitors.json";
    
    $json_data = file_get_contents($json_file); 
    $data = json_decode($json_data, true);
    
    // tekil ziyaretçileri tutacak diziler oluştur 
    $unique_today = array(); 
    $unique_yesterday = array(); 
    $unique_all = array();
    
    // bugünün tarihini al 
    $today = date("Y-m-d");
    
    // dünün tarihini al 
    $yesterday = date("Y-m-d", strtotime("-1 day"));
    
    // verileri döngüye sok 
    foreach ($data as $visitor) {
    
    // ziyaretçinin IP adresini ve tarihini al 
    $ip = $visitor["ip"]; 
    $date = $visitor["date"];
    
    // tüm zamanların tekil ziyaretçilerine ekle 
    if (!in_array($ip, $unique_all)) { 
    $unique_all[] = $ip; 
    }
    
    // tarih aralığına göre kontrol et 
    if ($date == $today) {
    
    // bugünün tekil ziyaretçilerine ekle 
    if (!in_array($ip, $unique_today)) { 
    $unique_today[] = $ip; 
    } } elseif ($date == $yesterday) {
    
    // dünün tekil ziyaretçilerine ekle 
    if (!in_array($ip, $unique_yesterday)) { 
    $unique_yesterday[] = $ip; 
    } } }
    
    // tekil ziyaretçi sayılarını döndür 
    return array( "today" => count($unique_today), "yesterday" => count($unique_yesterday), "all" => count($unique_all) ); }
    
    // tekil ziyaretçi sayılarını hesapla 
    $counts = count_all_unique();
    
    $today_unique = $counts["today"]; 
    $yesterday_unique = $counts["yesterday"]; 
    $all_unique = $counts["all"];
    
    // web sayfasında göster echo "<p>Bugün: <strong>$today_unique</strong> tekil ziyaretçi</p>"; echo "<p>Dün: <strong>$yesterday_unique</strong> tekil ziyaretçi</p>"; echo "<p>Tüm zamanlar: <strong>$all_unique</strong> tekil ziyaretçi</p>"; ?>