关于PHP写文件操作的具体实现

缘起:

100个进程都在繁忙地工作着,而且都在积极地将工作的结果写到日志文件中去。因为工作内容并不复杂,但是都需要写相同的日志文件,为了避免把日志文件写花了,于是每次写操作都会先flock住日志文件,结果,flock操作消耗了 1~100ms的时间; 其实,做一个单位的工作也就10ms内可以完成的,这下flock操作消耗时间就太长了,所以,需要一个解决办法。

为什么flock能消耗这么多时间?

一个进程的flock时间可能会是其余n个进程写日志的时间。故而如此,所以…

几种解决方案:

  1. 写日志不加锁。 应该会出现把日志写花的可能,故不可取
  2. 减少写日志的次数,
    • 合并多次日志
    • 或取消不必要的日志操作
    • 某些情况下不写这些日志
  3. 减少进程个数,避免flock排队的长度。这样,任务的处理能力会有所下降
  4. 是否日志操作外的其他进程的工作存在问题?

结论:

采用了减少写日志次数的方案,修改后,负载明显降低,变化如下:

 

其他

file_put_contents(…) 的实现:

相关代码:  main\streams\streams.c

从该代码来看,如果写失败一次,会直接返回,这时候会返回写入的字节数,可能只写入了部分数据,所以,判断返回值还是有意义的

 

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据