13

我在用着:

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX);

写入文件末尾并确保没有其他人(或脚本)同时写入同一个文件。

PHP 手册说,如果不成功,它将返回一个虚假值。

如果它无法获得对文件的锁定,它会失败还是继续尝试直到可以获得?如果在无法获得锁时它确实失败了,那么确保写入数据的最佳方法是什么?

也许在一个while循环中循环该函数,直到它不返回false(畏缩)或只是为用户(网站访问者)提供某种GUI请求他们再试一次?

4

2 回答 2

4

实际上,我之前的回答有点过时了。flock()阻塞直到获得请求的锁

PHP 支持以建议的方式锁定完整文件的可移植方式(这意味着所有访问程序都必须使用相同的锁定方式,否则将无法工作)。默认情况下,该函数将阻塞,直到获得请求的锁;这可以通过下面记录的 LOCK_NB 选项来控制(在非 Windows 平台上)。

因此,由于file_get_contents()使用它,我认为它是相同的。也就是说,请注意它因操作系统而异。

更重要的是,您不需要在您描述的场景中锁定文件,原因 NB 已经解释过。除非您使用的是 CLI SAPI,否则我想不出您应该担心文件锁定的常见场景。

于 2012-01-19T14:50:36.727 回答
0

如果该函数未能获得文件的锁定,那么它将返回一个您可以使用的错误。

if ($result === false) { print "failed to lock"; }

现在,如果您想尝试多次获得锁,只需使用循环来继续尝试写入文件。

于 2012-01-25T16:25:25.307 回答