2012-05-29 13 views
5

La concurrencia de lectura de archivos planos es casi ilimitada (corríjame si me equivoco); pero, ¿cómo es la concurrencia para escribir? Considere un registro de acceso sencillo escrito (para las visitas) en PHP como para añadir una línea de detalle de acceso finalizó con \n¿Cómo funciona LOCK para escribir registros en un archivo plano?

fopen(); // in append mode 
fwrite(); 
fclose(); 

Ya que tenemos visitantes concurrentes, cómo el sistema (un usuario que es el usuario wbserver/php) escribir los registros de vista al mismo tiempo?

Mi confusión es: la función file_put_contents() (que es un contenedor de las tres funciones anteriores) tiene una opción para el bloqueo (LOCK_EX)? ¿Es beneficioso usar esta opción de bloqueo? ¿Cómo afectará esto la escritura del registro?

ACTUALIZACIÓN: Mi pregunta es acerca de cómo LOCK originalmente funciona/afecta la escritura de registro en el archivo. No comparo file_put_contents y fwrite; incluso mi pregunta no está limitada a PHP. La pregunta es sobre bloquear un archivo durante el proceso de escritura.

+0

'file_put_contents()' tiene una opción para el bloqueo, compruebe el [Manual] (http://php.net/manual/en/function.file-put-contents.php). – yannis

+0

@YannisRizos Como mencioné en la pregunta original, sé que 'file_put_contents' tiene' LOCK_EX'. Mi pregunta es cómo afecta escribir un registro de acceso. – Googlebot

+0

Sí, tienes razón, obviamente mi comentario fue para la segunda revisión de la pregunta. Mala edición, esa. – yannis

Respuesta

3

file_put_contents() tiene una opción para bloquear, pero en mi opinión, debería usar flock() en su lugar.

De Manual:

banderas disponibles

FILE_USE_INCLUDE_PATH
Búsqueda de nombre de archivo en el directorio de inclusión. Consulte include_path para obtener más información sobre .

FILE_APPEND Si el nombre del archivo ya existe, agregue los datos al archivo en lugar de sobrescribirlo.

LOCK_EX Adquiera un bloqueo exclusivo en el archivo mientras procede a la escritura.

flock() le permite utilizar otros métodos:

LOCK_SH adquirir un bloqueo compartido (lectura). Para obtener un bloqueo exclusivo (escritor)
LOCK_UN para liberar un bloqueo (compartido o exclusivo).

Ver aquí: http://php.net/manual/en/function.flock.php y aquí: http://php.net/manual/en/function.file-put-contents.php

0

se advirtió, el bloqueo de archivos de registros de acceso es un entorno que puede fácilmente introducir una condición de carrera. tal vez buscar otro método? iniciar sesión en una base de datos, tal vez? Es demasiado fácil para un sistema bien diseñado tratar de abrir y escribir en el registro al mismo tiempo con procesos paralelos.

¿Tal vez eche un vistazo a monolog?hay algunos manejadores de registro allí para el registro asincrónico, lo que sería ideal para cualquier cosa que tenga que ver con el registro de acceso.

https://github.com/Seldaek/monolog

+0

Es bueno saber sobre 'monolog'; pero este es un registro de acceso personalizado, no el del sistema. Puede contener información de sesiones, cookies, inicio de sesión de miembros, etc. Además, mi pregunta es, en general, para escribir en el disco. – Googlebot

+0

@ Ali Debes ser muy cuidadoso, entonces, si va a estar conectado a algo hablador; cuanto más a menudo esté registrando datos, mayor será la posibilidad de que su código se agregue al registro solo para que golpee el bloqueo del archivo y no pueda iniciar sesión. En esta circunstancia, necesita iniciar sesión en algo en un SSD (velocidad de escritura rápida, pero poco probable que tenga como hardware de servidor), un ramdisk (escritura rápida pero inestable, perder potencia y los datos se han ido), o puede iniciar sesión en un disco espinoso y cruza los dedos y espero que nada se bloquee con el archivo de la escritura en el registro. – damianb

Cuestiones relacionadas