estoy tratando de crear una función (a los efectos de la tala)Atómicamente añadiendo una línea en un archivo y creándolo si no existe
append($path, $data)
que
- crea un archivo $ si no existe y
- adjunta atómicamente $ datos.
Tiene que
- soporte de alta concurrencia,
- de apoyo cadenas largas y
- ser tan performante como sea posible.
Hasta ahora el mejor intento es:
function append($file, $data)
{
// Ensure $file exists. Just opening it with 'w' or 'a' might cause
// 1 process to clobber another's.
$fp = @fopen($file, 'x');
if ($fp)
fclose($fp);
// Append
$lock = strlen($data) > 4096; // assume PIPE_BUF is 4096 (Linux)
$fp = fopen($file, 'a');
if ($lock && !flock($fp, LOCK_EX))
throw new Exception('Cannot lock file: '.$file);
fwrite($fp, $data);
if ($lock)
flock($fp, LOCK_UN);
fclose($fp);
}
Funciona bien, pero parece que hay una bastante complejo. ¿Hay una manera más limpia (¿incorporada?) Para hacerlo?
¿Puedo preguntar para qué era el downvote? – FtDRbwLXw6
Creo que esto no usará el modo 'x' para abrir un archivo (O_EXCL en C-land), por lo que puede tener una condición de carrera si no existe un archivo. Consulte https://github.com/php/php-src/blob/master/ext/standard/file.c (parece que solo usa 'c') –
30 ups y no es la mejor respuesta. mundo pobre! ': (' –