Этот скрипт сбрасывается после 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 />'; } ?>
Ваш код может страдать от состояния гонки .
В середине пути вы снова открываете файл в режиме 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 />';
Поскольку начальный открытый режим находится в режиме append-or-create, вам не нужно обрабатывать случай, когда файл не существует, если начальный открытый не сработал.
При блокировке файла этот код никогда не должен сбрасывать счетчик в файле, независимо от того, сколько одновременных запросов есть. (Если, конечно, у вас не будет другой записи кода в файл).
Я не вижу, где произойдет сброс, но как работает скрипт, кажется довольно простым. Возможно, попробуйте отредактировать total_site_page_loads.txt
с чем-то вроде 99990
и посмотреть, что происходит с этим файлом при переходе на 100000
?