2011-03-29 15 views
20

file_put_contents() hace que sea muy fácil agregar datos a un archivo en PHP. Me gustaría intentar usar PHP "threads" a file_put_contents() en el mismo archivo de registro de diferentes subprocesos de PHP. ¿Existe algún riesgo al ejecutar file_put_contents() en el mismo archivo desde diferentes subprocesos de PHP o estos hilos se bloquearán felizmente si el archivo está bloqueado o se accede por otro hilo?¿Existe algún riesgo al ejecutar file_put_contents() en el mismo archivo desde diferentes subprocesos de PHP?

EDIT: encontrado a similar question que recomienda flock(), pero la pregunta sobre el riesgo no parece abordarse por completo. ¿Son estas operaciones de escritura "atómicas"?

Respuesta

20

como se dice en la página del manual (que le dio un enlace para!):

// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file 
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time 
file_put_contents($file, $person, FILE_APPEND | LOCK_EX); 

usar la bandera LOCK_EX para evitar escrituras dobles

+7

Una cosa no está muy clara aquí (al menos para mí) - Está claro que al usar la bandera 'LOCK_EX' nadie intervendrá mientras está escribiendo. ¿Pero a qué costo para ellos? ¿Qué sucede si una de sus principales preocupaciones es el éxito de esa * otra persona *? ¿Es seguro suponer que el otro hilo esperará a que se elimine el bloqueo y tendrá éxito en su escritura? –

+1

[flock] (http://www.php.net/manual/en/function.flock.php) se utiliza para el bloqueo. Por defecto, la función se bloqueará hasta que se adquiera el bloqueo, y dado que 'file_put_contents' no proporciona ninguna forma de especificar nada más, supongo que también se bloqueará aquí. – Jasper

+2

Y para aclarar las cosas: es un bloqueo de asesoramiento. Solo cuando el otro subproceso usa el mismo tipo de bloqueo funcionará, y por lo tanto es válido que alguien que llame * a esta función * (u otra cosa basada en el mismo sistema de bloqueo) bloqueará (en esta llamada). Cualquiera que no esté pasando por aros para respetar este bloqueo podrá ignorarlo por completo y no tendrá que esperar mágicamente ni nada por el estilo. – Jasper

4

Respuesta simple, sí. choques pueden ocurrir

usar algo como file_put_contents($location, $data, FILE_APPEND | LOCK_EX);

Cuando se espera que varias instancias para escribir en el mismo archivo, se debe adquirir un bloqueo exclusivo por lo que ningún otro proceso puede escribir en el archivo hasta que el actual ha terminado de escribir que es datos

Cuestiones relacionadas