Aquí está un ejemplo sencillo que pone de relieve el peligro de wites simultáneas:
<?php
for($i = 0; $i < 100; $i++) {
$pid = pcntl_fork();
//only spawn more children if we're not a child ourselves
if(!$pid)
break;
}
$fh = fopen('test.txt', 'a');
//The following is a simple attempt to get multiple threads to start at the same time.
$until = round(ceil(time()/10.0) * 10);
echo "Sleeping until $until\n";
time_sleep_until($until);
$myPid = posix_getpid();
//create a line starting with pid, followed by 10,000 copies of
//a "random" char based on pid.
$line = $myPid . str_repeat(chr(ord('A')+$myPid%25), 10000) . "\n";
for($i = 0; $i < 1; $i++) {
fwrite($fh, $line);
}
fclose($fh);
echo "done\n";
Si los archivos adjuntos son seguros, debe obtener un archivo con 100 líneas, todas las cuales tienen aproximadamente 10 000 caracteres de longitud y comienzan con un número entero. Y a veces, cuando ejecuta este script, eso es exactamente lo que obtendrá. A veces, algunos añadidos entrarán en conflicto, y se destrozarán, sin embargo.
puede encontrar líneas dañados con grep '^[^0-9]' test.txt
Esto se debe a file append is only atomic if:
- se hace un solo fwrite() llama a
- y que fwrite() es más pequeño que PIPE_BUF (en algún lugar alrededor de 1 -4k)
- y escribe en un sistema de archivos totalmente compatible con POSIX
Si hace más de una llamada para escribir durante su registro, o escribe más de 4k, todas las apuestas están desactivadas.
Ahora, en cuanto a si esto importa o no: ¿está de acuerdo con tener algunas líneas corruptas en su registro bajo una gran carga? Honestamente, la mayoría de las veces esto es perfectamente aceptable, y puede evitar la sobrecarga de bloqueo de archivos.
+1. Recibo entradas superpuestas en mi registro de acceso de apache todos los días, por lo que a una carga alta definitivamente se produce una pérdida. Pero para un archivo de registro, las pocas filas que se rompen realmente no importan, y ciertamente no valen la sobrecarga del bloqueo de archivos. –
@Laimoncijus, ¿Quieres decir que los añadidos son atómicos? – Pacerier