在不同PHP线程的同一文件上运行file_put_contents()是否存在风险?

时间:2011-03-29 22:14:27

标签: php

我知道file_put_contents()可以很容易地将数据附加到PHP中的文件中。我想尝试将PHP“threads”用于file_put_contents()到来自不同PHP线程的相同日志文件。在不同PHP线程的同一文件上运行file_put_contents()是否存在风险,或者如果文件被锁定或被另一个线程访问,这些线程是否会高兴地阻塞?

编辑:发现a similar question建议flock(),但风险问题似乎没有完全解决。这些“原子”写操作吗?

2 个答案:

答案 0 :(得分:24)

正如它在手册页上所说的那样(你给了一个链接!):

// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);

使用LOCK_EX标志来防止双重写入

答案 1 :(得分:4)

简单回答,是的。可能发生冲突

使用类似file_put_contents($location, $data, FILE_APPEND | LOCK_EX);

的内容

当您希望多个实例写入同一个文件时,您应该获取一个独占锁,这样在当前文件写完数据之前,其他任何进程都无法写入该文件