блокировка файлов в PHP (тип чтения / записи)

У меня есть сценарий, когда один процесс PHP записывает файл примерно 3 раза в секунду, а затем несколько процессов PHP читают этот файл.

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

У меня проблема в том, что иногда открытие файла для записи занимает много времени, иногда даже до 2-3 секунд. япри условии, что это происходит потому, что он заблокирован чтением (или чем-то другим), но у меня нет никакого убедительного способа доказать это, плюс, согласно тому, что я понимаю из документации, PHP не должен ничего блокировать. Это происходит каждые 2-5 минут, так что это довольно часто.

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

Я пишу файл с этим кодом:

$handle = fopen(DIR_PUBLIC . 'filename.txt', "w");
fwrite($handle, $data);
fclose($handle);

И я читаю это непосредственно с:

file_get_contents('filename.txt')

(он не передается напрямую клиентам в виде статического файла, я получаю обычный запрос PHP, который читает файл и выполняет с ним некоторые базовые функции)

Размер файла составляет около 11 КБ, поэтому для чтения / записи не требуется много времени. Хорошо под 1 мс.

Это типичная запись в журнале, когда возникает проблема:

  Open File:    2657.27 ms
  Write:    0.05984 ms
  Close:    0.03886 ms

Не уверен, что это уместно, но чтение происходит в обычных веб-запросах через apache, но запись - это обычное PHP-выполнение «командной строки», выполняемое cron Linux, оно не проходит через Apache.

Любые идеи о том, что может быть причиной такой большой задержки при открытии файла?
Какие-нибудь указатели на то, где я мог бы искать, чтобы помочь мне точно определить истинную причину?

В качестве альтернативы, можете ли вы придумать, что я мог бы сделать, чтобы избежать этого? Например, я бы хотел установить тайм-аут на 50 мс для fopen, и если он не откроет файл, он просто пропустит его и позволит следующему запуску cron позаботиться об этом.

Опять же, мой приоритет состоит в том, чтобы повторять биение хронона трижды в секунду, все остальное второстепенно, поэтому любые идеи, предложения, что-либо чрезвычайно приветствуются.

Спасибо!
Даниил

Ответы на вопрос(2)

Ваш ответ на вопрос