bloqueo de archivos fopen en PHP (tipo de situación de lector / escritor)

Tengo un escenario en el que un proceso PHP está escribiendo un archivo aproximadamente 3 veces por segundo, y luego varios procesos PHP están leyendo este archivo.

Este archivo es esencialmente un caché. Nuestro sitio web tiene un sondeo muy insistente, para los datos que cambian constantemente, y no queremos que todos los visitantes lleguen a la base de datos cada vez que realizan una encuesta, por lo que tenemos un proceso cron que lee la base de datos 3 veces por segundo, procesa los datos, y lo descarga en un archivo que los clientes de sondeo pueden leer.

El problema que tengo es que, a veces, abrir el archivo para escribir lleva mucho tiempo, a veces incluso hasta 2-3 segundos. estoyasumiendo que esto sucede porque está bloqueado por lecturas (o por algo), pero no tengo ninguna forma concluyente de demostrar eso, además, de acuerdo con lo que entiendo de la documentación, PHP no debería bloquear nada. Esto sucede cada 2-5 minutos, por lo que es bastante común.

En el código, no estoy haciendoalguna tipo de bloqueo, y prácticamente no me importa si la información de ese archivo se corrompe, si falla una lectura o si los datos cambian en el medio de una lectura. Sin embargo, me importa si escribir le lleva 2 segundos, esencialmente, porque el proceso que tiene que ocurrir tres veces por segundo ahora omitió varios latidos.

Estoy escribiendo el archivo con este código:

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

Y lo estoy leyendo directamente con:

file_get_contents('filename.txt')

(no se sirve directamente a los clientes como un archivo estático, recibo una solicitud PHP regular que lee el archivo y hace algunas cosas básicas con él)

El archivo tiene aproximadamente 11kb, por lo que no toma mucho tiempo leer / escribir. Muy por debajo de 1 ms.

Esta es una entrada de registro típica cuando ocurre el problema:

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

No estoy seguro de si es relevante, pero las lecturas ocurren en solicitudes web regulares, a través de apache, pero la escritura es una ejecución de PHP de "línea de comando" regular realizada por el cron de Linux, no está pasando por Apache.

¿Alguna idea de lo que podría estar causando este gran retraso en la apertura del archivo?
¿Alguna sugerencia sobre dónde podría buscar para ayudarme a determinar la causa real?

Alternativamente, ¿puedes pensar en algo que pueda hacer para evitar esto? Por ejemplo, me encantaría poder establecer un tiempo de espera de 50 ms para abrir, y si no abre el archivo, simplemente salta hacia adelante y deja que la próxima ejecución del cron se encargue de ello.

Una vez más, mi prioridad es mantener al cron golpeando tres veces por segundo, todo lo demás es secundario, por lo que cualquier idea, sugerencia, cualquier cosa es extremadamente bienvenida.

¡Gracias!
Daniel

Respuestas a la pregunta(2)

Su respuesta a la pregunta