PHP中的并发Fwrite?

时间:2011-05-16 19:19:52

标签: php logging fwrite

我有一个fwrite函数来写入延迟插入到数据库的日志。

我们的访问率为每小时20,000次。

所以每个fwrite为0.18s。

我的问题是,当有2个或3个访问者同时进入时,PHP是否可能会错过几个日志?

如果是的话,我该怎么做这个并发?

我的代码只是正常的Fopen fwrite fclose。

2 个答案:

答案 0 :(得分:6)

如果我是你,我会避免这种情况。如果必须为每个请求记录一些内容,请使用Gearman之类的方法对数据进行排队以便以后处理,或者将其存储在数据库(或NoSQL数据库)中以便以后处理。不要忘记,数据库旨在解决这个问题。不要尝试使用日志文件重新创建数据库。

更不用说每次写入0.18s可能比插入DBM要贵得多(对我而言,MySQL通常会在0.01秒内返回写入,具体取决于表格,MongoDB可能会更快)。

答案 1 :(得分:1)

你是如何解雇写作的?如果每个请求(每次访问1次)都有一个相关的fwrite,那么你就不会错过任何请求。当你的网络服务器排队/处理请求(峰值流量)时,它们可能变慢(呃),但PHP是请求驱动的,所以对于每个页面加载,你都会执行fwrite。

我说你不​​会错过任何因为,除非你做一些非阻塞I / O,你的脚本将阻止fwrite调用。换句话说,fwrite将执行。

在使用PHP编写的请求驱动的应用程序上获取任何类型的并发性时,您将无法做任何非常时髦的事情。