PHP 同时写入文件
我有两个不同的PHP文件,它们都写入同一个文件。每个 PHP 脚本都由两个不同 HTML 页面的用户操作调用。我知道可以调用两个PHP文件,但是两个PHP文件会尝试同时写入该文件吗?如果是,会发生什么?此外,可以使其中一个PHP优雅地失败(文件写入将失败,另一个PHP可以写入文件),因为一个PHP函数不如另一个重要。
我有两个不同的PHP文件,它们都写入同一个文件。每个 PHP 脚本都由两个不同 HTML 页面的用户操作调用。我知道可以调用两个PHP文件,但是两个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);
因此,如果它发现文件有事情繁忙,它将不做任何事情。
请注意,如果文件作为追加打开,posix 会声明原子访问。这意味着您只需使用多个线程附加到文件中,它们的行就不会损坏。
我确实用十几个线程和几十万行对此进行了测试。没有一条线被损坏。
这可能不适用于超过 1kB 的字符串,因为缓冲区大小可能会超过。
这可能也不适用于不符合 posix 的窗口。