Php счетчик, который никогда не выходит из строя

Мне удалось сделать этот счетчик 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);

0

Решение

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

1

Другие решения

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

<?php

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector