Мне удалось сделать этот счетчик 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);
В файловой системе ваш код делает запрос на открытие, чтение, закрытие, открытие, запись и закрытие файла для каждого посетителя. Если файл записывается, он заблокирован от записи другим экземпляром, это поведение файловой системы. Возможно, было бы лучше иметь простую таблицу базы данных с столбцом автоинкремента и просто вставлять строку для каждого посещения, а затем удалять ее, тогда вы можете просто выбрать верхнюю строку, чтобы вернуть значение.
Попробуйте эту версию:
<?php
$counter_file = ("count.txt");
$count = @file_get_contents($counter_file);
$count = $count ? intval($count) + 1 : 1;
file_put_contents($counter_file, $count);
flock
file_put_contents('count.txt', (int)file_get_contents('count.txt') + 1;
намного короче. :)