2010-07-21 10 views
7

Tengo una pregunta sobre cómo maneja PHP las operaciones del sistema de archivos. Estoy ejecutando este código que depende de que se cree un archivo antes de que se use, y parece que cuando ejecuto el código se convierte en una condición de carrera: a veces funciona, el archivo se crea y el código php lo usa, a veces falla¿PHP espera las operaciones del sistema de archivos (como file_put_contents) para completar antes de continuar?

Me preguntaba cómo php maneja las operaciones del sistema de archivos, ¿lo envía en segundo plano o espera hasta que la operación se complete?

+2

'bloqueo' es el término que le interesa. Las operaciones de bloqueo hacen que su programa espere (o 'bloquee') hasta que se completen. Las operaciones no bloqueantes o asincrónicas son aquellas que se envían 'fuera del contexto' :) – meagar

Respuesta

6

Sí, a menos que abra un identificador de archivo y luego la ponemos a modo de no bloqueo: stream_set_blocking()

+2

Esto no es verdad. Si abre y simplemente (f) escribe en él, los datos no se escriben en el disco. Si fwrite usa la función C fwrite, es muy probable que los datos ni siquiera hayan llegado al sistema operativo. Como señaló @Matthew Flaschen, los datos solo se descargan en el disco durante fclose y fflush. – dmeister

+0

@ircmaxell, la respuesta necesita una elaboración. – Pacerier

3

PHP debe esperar hasta que se complete el proceso. Pero no saber cómo está implementando las operaciones es difícil de decir. Si puede publicar un código de ejemplo que está utilizando que sería útil para que podamos ayudarlo a descubrir por qué no funciona correctamente.

+0

debería, pero parece que no es verdad. Acabo de tener un problema donde los archivos parecen no estar completamente escritos antes de que otro conjunto de código se ejecute para procesarlos, lo que causó el extraño problema –

8

file_put_contents es equivalente a fopen, fwrite, fclose. fclose debe asegurarse de que el archivo esté completamente enrojecido en el disco.

+3

En realidad, la única forma de saber con certeza si el archivo está totalmente enrojecido en el disco es desactivar el almacenamiento en caché de escritura simultánea en las unidades. De lo contrario, todo lo que puede decir es que el sistema de archivos emitió los comandos de escritura, no que la escritura se haya cometido correctamente en el disco ... – ircmaxell

+0

¿La bandera 'LOCK_EX' resuelve esto? http://php.net/manual/en/function.file-put-contents.php – martin

2

Año 2013, en mi variedad de jardín común linux vps con cpanel, con configuraciones predeterminadas, con php 5.2.17, file_put_contents siempre lleva ~ 5ms para longitudes cortas de cadena.

Accidentally 5ms es aproximadamente el tiempo de escritura comprometido de un disco duro de alta calidad.

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND); 

Esto lleva ~ 5 ms consistentemente. Eso parece incluir 'bloqueo' y 'enrojecimiento'. Así que para aquellos que se preguntan acerca de la velocidad de file_put_contents, al menos 5 ms/operación en servidores comunes 2013 04.

Si necesita velocidad, por ejemplo durante algún registro, @Matthew Flaschen dijo:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk. 

Entonces uno necesita :

function file_put_contents_fast() {...no fclose...} 

Pero va a tomar un poco de investigación para averiguar qué sucede si los identificadores de archivo se dejan abiertas. Php closes them at exit, pero ¿realmente lo hace todo el tiempo? Incluso si se bloquea? ¿Qué sucede si un archivo queda abierto por php después de un bloqueo? etc, etc. Después de 30 minutos de lectura manual de php y de búsqueda de Google, no se mencionó tal y sus consecuencias.

Cuestiones relacionadas