我有两个不同的PHP文件,它们都写入同一个文件。每个PHP脚本都由两个不同HTML页面的用户动作调用。我知道这两个PHP文件可以被调用,但是它们会同时尝试写入该文件吗?如果是,会发生什么?此外,是否可以使其中一个PHP优雅地失败(文件写入将仅失败,并且另一个PHP可以写入该文件),因为一个PHP函数比另一个不重要。
flock()
来进行锁定:$f = fopen('some_file', 'a');
flock($f, LOCK_EX);
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
fclose($f);
这将使脚本在写入文件之前相互等待。如果您愿意,那些“不太重要”的脚本可以执行:$f = fopen('some_file', 'a');
if(flock($f, LOCK_EX | LOCK_NB)) {
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
}
fclose($f);
这样,如果它发现某个文件已被占用,它就不会执行任何操作。
请注意:
从PHP 5.3.2版本开始,当文件的资源句柄被关闭时,自动解锁已经被移除。 现在解锁必须手动完成。
更新后向兼容代码如下:
if (($fp = fopen('locked_file', 'ab')) !== FALSE) {
if (flock($fp, LOCK_EX) === TRUE) {
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN);
}
fclose($fp);
}
也就是说,你必须显式调用 flock(.., LOCK_UN),因为 fclose() 现在不再这样做了。
提示:flock仅适用于*nix系统,无法在Windows上使用。
flock
系统调用,但在 flock
PHP函数中已经将其抽象化处理。 - Piskvor left the building