tutorialspoint - upload file php
PHP Escrituras simultáneas de archivos (5)
Echa un vistazo a la función de flock .
Tengo dos archivos PHP diferentes que escriben en el mismo archivo. Cada script PHP es llamado por una acción de usuario de dos páginas HTML diferentes. Sé que será posible llamar a los dos archivos PHP, pero ¿ambos archivos PHP intentarán escribir en el archivo al mismo tiempo? Si es así, ¿qué pasará? Además, es posible hacer que uno de los PHP falle correctamente (la escritura del archivo solo fallará, y el otro PHP puede escribir en el archivo) ya que una función de PHP es menos importante que la otra.
FYI: flock solo funciona en * nix y no está disponible en Windows
Tenga en cuenta que Posix indica el acceso atómico si los archivos se abren como anexos . Esto significa que simplemente puede adjuntar al archivo con varios subprocesos y sus líneas no se corromperán.
Hice una prueba con una docena de hilos y unos cientos de miles de líneas. Ninguna de las líneas fue corrompida.
Es posible que esto no funcione con cadenas de más de 1kB, ya que el tamaño de buffers puede exceder.
Esto también podría no funcionar en Windows que no es compatible con posix.
Tenga en cuenta:
A partir de PHP 5.3.2, se eliminó el desbloqueo automático cuando se cierra el manejador de recursos del archivo. Desbloquear ahora siempre tiene que hacerse manualmente.
El código compatible con versiones anteriores actualizado es:
if (($fp = fopen(''locked_file'', ''ab'')) !== FALSE) {
if (flock($fp, LOCK_EX) === TRUE) {
fwrite($fp, "Write something here/n");
flock($fp, LOCK_UN);
}
fclose($fp);
}
es decir, debe llamar a flock (.., LOCK_UN) explícitamente porque fclose () ya no lo hace.
La forma habitual de abordar esto es hacer que ambos scripts usen flock()
para el bloqueo:
$f = fopen(''some_file'', ''a'');
flock($f, LOCK_EX);
fwrite($f, "some_line/n");
flock($f, LOCK_UN);
fclose($f);
Esto hará que los scripts se esperen unos a otros para terminar con el archivo antes de escribirlo. Si lo desea, el script "menos importante" puede hacer:
$f = fopen(''some_file'', ''a'');
if(flock($f, LOCK_EX | LOCK_NB)) {
fwrite($f, "some_line/n");
flock($f, LOCK_UN);
}
fclose($f);
de modo que simplemente no hará nada si encuentra que algo está ocupado con el archivo.