いいえPOSIX互換システムでは、すべてのロックはとにかく助言されるので、たとえApacheが読み取りロックを取得しても、他のプロセスはファイルを書き込むことができます。したがって
[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
、あなたのJSONファイルが部分的にしか書かれていることを発生します
あなたはstrace
と判断することができます。この問題を回避するには、JSONファイルを同じファイルシステム上のテンポラリファイルに書き込んで、アブゾートrename
を使用してファイルを上書きします。
こうすれば、open
が成功した場合、apacheは古いファイルを引き続き提供します。 open
の前にrename
が終了すると、Apacheは完成した新しいファイルを取得します。
一貫性(電源障害などの場合)が心配な場合は、閉じる前にJSONファイルを書き込むアプリケーションでfsync
に電話することもできます。
本当に '物理的な'ファイルが必要ですか、コンテンツを出力するだけでファイルを偽造できますか? – PeeHaa