Счетчик php который никогда не подводит

0

Мне удалось сделать этот счетчик PHP без базы данных, это очень просто, поскольку он увеличивает количество посещений в TXT файле:

$counter_file = ("count.txt");
$fp = fopen($counter_file, "r");
$count = fread($fp, 1024);
fclose($fp);
$count = $count +1;
$fp = fopen($counter_file, "w");
fwrite($fp, $count);
fclose($fp);

Но этот счетчик терпит неудачу на удаленном сервере, когда визиты происходят слишком быстро. Он возвращается к 0. Что может объяснить это поведение и как убедиться, что счетчик никогда не вернется к 0?

Изменить: этот сценарий швы, чтобы быть более надежным. Он использует flock как предлагал @ghopst.

$counter_file = ("count.txt");
$handle = fopen($counter_file,"r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize($counter_file));
    $count = $count + 1;
    ftruncate($handle, 0);
    rewind($handle);
    fwrite($handle, $count);
    flock($handle, LOCK_UN);
} else {
    echo "Could not Lock File!";
}
fclose($handle);
  • 2
    Чтобы предотвратить его сброс, заблокируйте файл во время записи, чтобы избежать одновременной записи. Вы можете использовать flock
  • 0
    file_put_contents('count.txt', (int)file_get_contents('count.txt') + 1; намного короче. :)
Теги:
counter

2 ответа

1

В файловой системе ваш код делает запрос на открытие, чтение, закрытие, открытие, запись и закрытие файла для каждого посетителя. Если файл записывается, он заблокирован от записи другим экземпляром, это поведение файловой системы. Возможно, было бы лучше иметь простую таблицу базы данных с столбцом автоинкремента и просто вставлять строку для каждого посещения, а затем удалять ее, тогда вы можете просто выбрать верхнюю строку, чтобы вернуть значение.

-2

Попробуйте эту версию:

<?php

    $counter_file = ("count.txt");
    $count = @file_get_contents($counter_file);
    $count = $count ? intval($count) + 1 : 1;
    file_put_contents($counter_file, $count);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню