Как сохранить этот счетчик от сброса на 100 000?
Этот скрипт сбрасывается после 100 000. Что мне нужно изменить, чтобы предотвратить сброс и вместо этого продолжать считать?
<?php
$filename1 = 'content/general_site_data/total_site_page_loads.txt';
if (file_exists($filename1)) {
$fh = fopen("content/general_site_data/total_site_page_loads.txt", "a+");
if($fh==false)
die("unable to create file");
$filec = 'content/general_site_data/total_site_page_loads.txt';
if (!is_writable($filec))
die('not writable');
$total_site_page_loads = trim(file_get_contents($filec)) + 1;
fwrite(fopen($filec, 'w'), $total_site_page_loads);
echo '------------------------------<br />
Site Wide Page Views: '.$total_site_page_loads.'<br />';
} else {
$fh = fopen($filename1, "a");
$total_site_page_loads = trim(file_get_contents($filename1)) + 1;
fwrite($fh, $total_site_page_loads);
fclose($fh);
echo '------------------------------<br />
Site Wide Page Views: '.$total_site_page_loads.'<br />';
}
?>
2 ответа
Ваш код может страдать от состояния гонки.
В середине пути вы снова открываете файл в w
режим, который усекает файл до нулевой длины. Если откроется другая копия вашего скрипта и будет пытаться прочитать файл, пока он был обрезан, но до того, как он будет прочитан, счетчик будет сброшен на ноль.
Вот обновленная версия вашего кода:
$filename = 'content/general_site_data/total_site_page_loads.txt';
// Open our file in append-or-create mode.
$fh = fopen($filename, "a+");
if(!$fh)
die("unable to create file");
// Before doing anything else, get an exclusive lock on the file.
// This will prevent anybody else from reading or writing to it.
flock($fh, LOCK_EX);
// Place the pointer at the start of the file.
fseek($fh, 0);
// Read one line from the file, then increment the number.
// There should only ever be one line.
$total_site_page_loads = 1 + intval(trim(fgets($fh)));
// Now we can reset the pointer again, and truncate the file to zero length.
fseek($fh, 0);
ftruncate($fh, 0);
// Now we can write out our line.
fwrite($fh, $total_site_page_loads . "\n");
// And we're done. Closing the file will also release the lock.
fclose($fh);
echo '------------------------------',
'<br />Site Wide Page Views: ',
$total_site_page_loads,
'<br />';
Поскольку начальное открытие находится в режиме добавления или создания, вам не нужно обрабатывать случай, когда файл не существует, если только первоначальное открытие не удалось.
С блокировкой файла этот код никогда не должен сбрасывать счетчик в файле, независимо от количества одновременных запросов. (Если, конечно, у вас нет другого кода, записывающего в файл, конечно.)
Я не вижу, где произойдет сброс, но как работает скрипт, довольно просто. Может быть, попробуйте редактирование total_site_page_loads.txt
что-то вроде 99990
и посмотреть, что происходит с этим файлом, когда вы переходите к 100000
?