有大量文件需要处理。
用一个php进程去操作会很慢。
如何在一个进程读某一个文件的时候,把文件锁上。
不让其他进程可以再读而直接跳过,继续读其他的?
把正在读得文件rename,读完之后再rename回来,效率挺低的。如果实在没有更好的方法,就只能用这个了。flock,测试了一下,貌似不太好用,试了一下,没实现文件的非阻塞读锁。
给不同进程分配不同的文件,不好实现。
也没数据库。就算有。用数据库做锁,貌似比rename更低效。
请问有什么更好的方式可以给文件加 读锁。因为,只需要读文件。
PHP里面文件 非阻塞模式 排它锁:
$fp = fopen($file_name, 'w+');
if (!$fp) exit('文件打开失败!');
if (flock($fp, LOCK_EX | LOCK_NB)) {
//------执行业务流程
//------执行业务流程
flock($fp, LOCK_UN);
} else {
echo '加锁失败,请稍后重试!';
}
fclose($fp);
用memcached实现吧。
比如读取文件 $filename = "t.txt";
if(!$memcached->get($filename)){
//文件锁不存在,那么执行文件读取功能
//首先再将文件锁住,
$memcaced->save($filename,'1');
$fs = fopen($filename,'r+');
fclose($fs);
//读取完毕释放文件锁
$memcaced->delete($filename);
}else{
// 文件锁已经存在,跳过
}
以上是 memcaced 纯内存操作,速度会很快,根本不要考虑到性能的问题,当然还有一种方法,采用真正的文件锁,即添加一个新文件的方法控制,文件争用,但是此方法将加大IO的开销。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。