одновременное чтение / запись файла - PullRequest
9 голосов
/ 05 июня 2011

Что происходит, когда поступает много запросов на чтение и запись в файл на PHP? Запросы попадают в очередь? Или только один принят, а остальные отбрасываются?

Я планирую использовать текстовый счетчик посещений.

Ответы [ 3 ]

6 голосов
/ 05 июня 2011

Вы можете столкнуться с проблемой состояния гонки

Чтобы избежать этого, если вам нужны только простые данные добавления, вы можете использовать

file_put_contents(,,FILE_APPEND|LOCK_EX);

и не беспокойтесь о сохранности ваших данных.

Если вам нужна более сложная операция, вы можете использовать flock (используется для простой задачи чтения / записи)

Для вашего счетчика скриптов PHP я предлагаю вам сделать что-то вроде этого:

//> Register this impression
file_put_contents( $file, "\n", FILE_APPEND|LOCK_EX );

//> Read the total number of impression
echo count(file($file));

Таким образом, вам не нужно реализовывать механизм блокировки, и вы можете облегчить работу системы и вашего скрипта кода

Добавление

Чтобы избежать подсчета array file(), вы можете сделать систему еще легче благодаря этому:

//> Register this impression
file_put_contents( $file, '1', FILE_APPEND|LOCK_EX );

//> Read the total number of impression
echo filesize($file);

В основном, чтобы прочитать номер вашего счетчика, вам просто нужно прочитать его размер файла, учитывая, что каждое впечатление добавляет 1 байт к нему

4 голосов
/ 05 июня 2011

Нет, запросы не будут поставлены в очередь, читатель получит поврежденные данные, писатели будут перезаписывать друг друга, данные будут повреждены.

Вы можете попробовать использовать flock и xрежим fopen .
Кодировать хороший блокирующий мьютекс не так просто, поэтому попробуйте найти существующий вариант или переместить данные из файла в БД.

1 голос
/ 05 июня 2011

Вы можете использовать flock () , чтобы заблокировать файл перед чтением / записью в него.Если другие потоки удерживают блокировку файла, flock() будет ожидать освобождения других блокировок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...