No. En sistemas compatibles con POSIX, todos los bloqueos son de todos modos asesores, por lo que incluso si apache obtiene un bloqueo de lectura, el otro proceso podría simplemente escribir el archivo.
Usted puede determinar que con strace
:
[pid 7246] open("/var/www/file.json", O_RDONLY|O_CLOEXEC) = 11
[pid 7246] fcntl(11, F_GETFD) = 0x1 (flags FD_CLOEXEC)
[pid 7246] mmap(NULL, 20, PROT_READ, MAP_SHARED, 11, 0) = 0x7f53f93da000
[pid 7246] munmap(0x7f53f93da000, 20) = 0
[pid 7246] writev(10, [{"HTTP/1.1 200 OK\r\nDate: Thu, 26 J"}, ...) = 365
[pid 7246] close(11) = 0
Por lo tanto, puede suceder que el archivo JSON está sólo parcialmente escrito. Para evitar este problema, escriba su archivo JSON en un archivo temporal en el mismo sistema de archivos y utilice el rename
atómico para sobrescribir el archivo.
De esta forma, si el open
ha tenido éxito, apache continuará publicando el archivo anterior. Si el rename
finaliza antes del open
, apache obtendrá el archivo nuevo y completo.
Si le preocupa la consistencia (en el caso de un corte de energía, o algo así), también puede llamar al fsync
en la aplicación que escribe el archivo JSON antes de cerrarlo.
¿Realmente necesita un archivo 'físico' o puede simplemente falsificar el archivo simplemente emitiendo los contenidos? – PeeHaa