并发文件读/写

时间:2011-06-05 13:20:28

标签: php file-io

收到许多请求时,会发生什么?用PHP写入文件?请求排队了吗?或者只有一个被接受而其余的被丢弃了?

我打算使用基于文本的点击计数器。

3 个答案:

答案 0 :(得分:6)

您可能会遇到竞争条件

的问题

如果您只需要简单的追加数据,可以使用

来避免这种情况
file_put_contents(,,FILE_APPEND|LOCK_EX);

并且不要担心您的数据完整性。

如果您需要更复杂的操作,可以使用flock(用于简单的读写器问题)

对于你的PHP脚本计数器,我建议你做这样的事情:

//> Register this impression
file_put_contents( $file, "\n", FILE_APPEND|LOCK_EX );

//> Read the total number of impression
echo count(file($file));

这样您就不必实现阻止机制,并且可以使系统和代码脚本更轻松

附录

为避免必须计算array file(),您可以使系统更亮:

//> Register this impression
file_put_contents( $file, '1', FILE_APPEND|LOCK_EX );

//> Read the total number of impression
echo filesize($file);

基本上要读取你的计数器的数量,你只需要阅读它的文件大小,考虑到每个印象添加1个字节

答案 1 :(得分:4)

不,请求不会排队,读者会收到数据损坏,编写者会互相覆盖,数据会被损坏。

您可以尝试使用flockfopenx模式 编写好的锁定互斥锁并不是那么容易,因此请尝试查找现有的变量,或者尝试将数据从文件移动到数据库。

答案 2 :(得分:1)

您可以使用flock()在读取/写入文件之前锁定文件。如果其他线程持有文件锁,flock()将等待其他锁被释放。