¿Por qué está bloqueando un lío en PHP?
locking (2)
En desacuerdo con la respuesta de Wernight. Sí, la web es muy relevante, pero el factor limitante es cómo se comporta el SO.
En todos los sistemas operativos compatibles con PHP, solo hay 2 opciones para el bloqueo de archivos: bloqueo o no bloqueo. En última instancia, PHP debe utilizar el mecanismo de bloqueo de archivos del sistema operativo para evitar conflictos con el código no PHP que accede a los mismos archivos. Si utiliza bloqueos de bloqueo, entonces el script PHP puede bloquearse indefinidamente a la espera de que se libere el bloqueo, lo que no es un buen escenario para una aplicación web. OTOH si realiza una llamada de bloqueo sin bloqueo y falla, ¿qué debe hacer a continuación, simplemente espera un tiempo aleatorio y deja que todos sus scripts PHP intenten agarrar el bloqueo?
La única forma práctica de resolver el problema es con una solicitud de bloqueo en cola que supera el tiempo de espera, pero AFAIK no tiene un sistema operativo que proporcione esa instalación de forma nativa. Yo mismo escribí ese código, para un servidor web dedicado, por lo que no hubo ningún problema para permitir el acceso a otros programas, sin embargo, espero que sea posible extenderlo a un sistema de bloqueo obligatorio de todo el sistema utilizando inotify.
Un usuario de SO hizo una pregunta para la cual la respuesta fue efectivamente "usar un mecanismo de bloqueo".
Mientras investigaba mi respuesta, descubrí que no parece haber un mecanismo de bloqueo simple y confiable entre procesos en PHP. flock() tiene una gran advertencia de grasa:
En algunos sistemas operativos, flock () se implementa a nivel de proceso. Cuando use una API de servidor multiproceso como ISAPI, es posible que no pueda confiar en flock () para proteger los archivos contra otros scripts PHP que se ejecutan en subprocesos paralelos de la misma instancia de servidor.
La discusión en esta pregunta profundiza en el tema bastante a fondo, pero solo presenta soluciones bastante complejas: el uso de un disco RAM o Memcache.
Lo único que se ve bien a medias es GET_LOCK(). mySQL GET_LOCK().
Así que mi pregunta es: ¿es realmente así? ¿No existe realmente un sistema de bloqueo seguro simple, multiplataforma y simple en PHP? ¿Uno que es atómico y que liberará el bloqueo si el proceso del propietario muere y no necesita grandes esfuerzos de configuración?
PHP no está pensado como un proceso permanente, sino más bien como un hilo vivido a corto plazo en el sentido de que se crea y destruye a menudo. Dependiendo de la implementación, más de un proceso PHP puede ejecutarse al mismo tiempo en el mismo código.
Creo que las diversas implementaciones de PHP (mod_php, PHP CLI, etc.) dificultan el bloqueo y los hilos en PHP.