2012-01-19 18 views
8

que estoy usando:¿Cómo puedo usar file_put_contents() con FILE_APPEND | LOCK_EX de seguridad?

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX); 

escribir en el final de un archivo y para asegurarse de que nadie más (o script) también está escribiendo en el mismo archivo al mismo tiempo.

El PHP manual dice que devolverá un valor falso si no lo consigue.

Si no puede obtener un bloqueo en el archivo, ¿fallará o seguirá intentándolo hasta que pueda? Si falla cuando no se puede obtener el bloqueo, ¿cuál sería la mejor manera de garantizar que se escriban los datos?

¿Tal vez el bucle de la función en un bucle while hasta que no devuelve falso (cringe) o simplemente proporcionarle al usuario (visitante del sitio web) algún tipo de GUI solicitando que lo intente de nuevo?

+1

Apache genera un hilo en el que se ejecuta un proceso de PHP. Múltiples usuarios = múltiples procesos PHP. El proceso que adquirió el bloqueo es el único permitido para trabajar con el archivo. Todos los demás procesos recibirán un error de la función file_put_contents y los file_put_contents emitidos por esos usuarios no escribirán nada en el archivo. Eso significa que mientras 1 usuario está escribiendo, otros están siendo denegados y la función devolverá booleano 'false'. – Mjh

+0

La razón por la cual LOCK_EX existe es un tema completamente diferente. Si desea escribir en el archivo independientemente, simplemente elimine LOCK_EX ya que no lo necesita y la última persona que accederá a su sitio web/script será quien tendrá los datos escritos en el archivo. Además, dado que estás haciendo un apéndice, ¿de qué sirve bloquear el archivo? Solo elimínalo. – Mjh

+0

Estoy usando LOCK_EX y FILE_APPEND juntos porque otros scripts tienen la capacidad de escribir en el archivo y no sé qué pueden hacer mientras se le añaden datos y viceversa. – hozza

Respuesta

2

En realidad, mi respuesta anterior estaba un poco desactualizada. flock() bloquea hasta que el requested lock is acquired:

PHP soporta un modo portable de bloquear los archivos completos de una forma de asesoramiento (lo que significa que todos los programas de acceso tienen que usar el mismo modo de bloqueo o no funcionará). Por defecto, esta función se bloqueará hasta que se adquiera el bloqueo solicitado; esto se puede controlar (en plataformas que no sean de Windows) con la opción LOCK_NB documentada a continuación.

Así que desde file_get_contents() lo utiliza, supongo que es lo mismo. Dicho esto, ten en cuenta que varía según el sistema operativo.

Un poco más importante, no es necesario bloquear el archivo en el escenario que describió, por los motivos N.B. ya explicado A menos que esté utilizando el CLI SAPI, no puedo pensar en un escenario común en el que deba preocuparse por el bloqueo de archivos.

+0

@hozza por favor, no hay necesidad de adivinar lo que estoy pensando, solo estoy explicando cosas. Si no los entiendes, eso es algo diferente. Usar un ciclo junto con el sueño es simplemente ponerlo: estúpido. Estás haciendo FILE_APPEND, no hay necesidad de usar LOCK_EX en absoluto. No copies ciegamente ejemplos de php.net, te dice qué es qué y para qué se usa. – Mjh

+0

El código que proporcioné es un ejemplo. El escenario es simplemente muchos scripts que pueden anexar, truncar, escribir o leer el archivo. Solo quiero que una de estas cosas ocurra a la vez, por lo tanto, quiero bloquear el archivo con LOCK_EX cuando use file_put_contents(); – hozza

+0

Entonces, ¿qué dijo @NB? Intente ejecutar secuencias de comandos simultáneas y vea qué sucede – yannis

0

Si la función no puede obtener el bloqueo del archivo, devolverá un error que puede usar.

if ($result === false) { print "failed to lock"; } 

Ahora, si quiere tratar de obtener un candado algunas veces, simplemente use un bucle para seguir intentando escribir en el archivo.

Cuestiones relacionadas