为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 读文件怎么实现加锁

PHP 读文件怎么实现加锁

千巷猫影 2019-04-23 15:35:33
有大量文件需要处理。用一个php进程去操作会很慢。如何在一个进程读某一个文件的时候,把文件锁上。不让其他进程可以再读而直接跳过,继续读其他的?把正在读得文件rename,读完之后再rename回来,效率挺低的。如果实在没有更好的方法,就只能用这个了。flock,测试了一下,貌似不太好用,试了一下,没实现文件的非阻塞读锁。给不同进程分配不同的文件,不好实现。也没数据库。就算有。用数据库做锁,貌似比rename更低效。请问有什么更好的方式可以给文件加读锁。因为,只需要读文件。
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你的问题是:
1.很多文件,想多进程处理,以提高效率,缩短总处理时间
2.这些进程只需要读文件,不需要写
3.对每个文件,只要有一个进程处理过它就可以了,没有多个进程都必须处理它的需求你的需求其实是分治,将文件分为多个组(不一定要在文件系统上新建目录),然后分而治之,这种情况不需要用锁.锁不是用于这种场景的,锁用于下面这种场景:1.文件file.txt里面记录了user1的销售额和user2的销售额,user1+user2的销售总额
2.进程php1负责写入user1的数据,进程php2负责写入user2的数据,两个进程各读出销售总额显示给user1,user2
3.user1和user2同时要求写入,真的是同时,不是前后差个几秒什么的建议你这样解决:
1.启动多个PHP进程(nohupphpyour_script.phpyour_dir&)
2.每个PHP进程赋予一个序号(假设4个进程,那就0,1,2,3),可以通过对进程自身的pid模运算取余数得到,也可以在启动进程的时候通过命令行传入,随你了
3.每个进程在处理文件前先对文件名做crc32()运算,模一下进程总数:crc32(file_name)%4,取模结果与此进程的序号相等就读取内容并处理,不相等就跳过最后:小编帮我排个版吧...
                            
查看完整回答
反对 回复 2019-04-23
  • 2 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信