У меня есть сценарий, когда один процесс 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, ноwrite - это обычное PHP-выполнение «командной строки», выполняемое cron'ом из Linux, оно не проходит через Apache.
Есть идеи о том, что может быть причиной такой большой задержки при открытии файла?
Есть указания на то, где ямог бы помочь мне точно определить причину?
В качестве альтернативы, вы можете придумать, что я мог бы сделать, чтобы избежать этого?Например, я бы хотел установить тайм-аут на 50 мс для fopen, и если он не откроет файл, он просто пропустит его и позволит следующему запуску cron позаботиться об этом.
Опять же, мой приоритет состоит в том, чтобы повторять биение хронона трижды в секунду, все остальное второстепенно, поэтому любые идеи, предложения, что-либо чрезвычайно приветствуются.
Спасибо!
Даниэль