php中读写文件时锁的使用
php中很多函数在win32的情况下使用经常出现兼容性的问题,其中flock就是其中一个。
函数: flock(file,lock,block)
| 参数 | 描述 |
|---|---|
| file | 必需。规定要锁定或释放的已打开的文件。 |
| lock | 必需。规定要使用哪种锁定类型。 |
| block | 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。 |
flock() 操作的 file 必须是一个已经打开的文件指针。
lock 参数可以是以下值之一:
- 要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
- 要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
- 要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
- 如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
被 lock_ex 后的文件 再以read模式 fopen 的话将读到空内容!!!
如果没有判断就把它当作空做操作后再写入就出错啦….
test1.php
| 以下是代码片段: <?php $fd = fopen(”./test.txt”, ”w”); |
test2.php
| 以下是代码片段: <?php $fd = fopen(”./test.txt”, ”r”); echo fread($fd, 512); fclose($fd); ?> |
test3.php
| 以下是代码片段: <?php |
执行test1.php,然后执行test2.php,发现test2.php立即运行完成,内容为空。
执行test1.php,然后执行test3.php,发现test3.php会在test1.php执行之后获得内容。
貌似在使用fread的时候都必须使用flock,否则这个时候内容可能为空。
在PHP中经常会把数据库中的内容,通过php生成缓存文件,来减少数据库的负载压力。
| 以下是代码片段: <?php function writeCache(){} function getCache(){ //加锁read } if(!getCache) { //执行SQL语句,然后再写入缓存 } |
在php中fread的效率远高于fwrite的效率,因此在并发能力较大的情况下,缓存过期,导致大量请求到达后端Mysql上面可能会导致down机的情况发生,如何避免这种情况呢?当然,你可以采用memecached的主从缓存 ,通过时间切换来更新主从缓存的方式实现。
| 以下是代码片段: <?php function phpflock($dir) { function phpunlock($dir) |
建议继续学习:
- 无锁消息队列 (阅读:13725)
- 海量小文件存储 (阅读:8559)
- 其实,文件也可以truncate (阅读:8085)
- 并发编程系列之一:锁的意义 (阅读:6940)
- 无锁HashMap的原理与实现 (阅读:6213)
- 关于Linux的文件系统cache (阅读:5502)
- MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等) (阅读:5324)
- Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (阅读:5171)
- 修改系统最大文件句柄数 (阅读:4650)
- DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题 (阅读:4791)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:排头兵 来源: 排头兵-互联网开发实践
- 标签: 文件 锁
- 发布时间:2010-01-20 09:17:45
-
[914] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[54] 整理了一份招PHP高级工程师的面试题 -
[53] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 海量小文件存储 -
[52] 全站换域名时利用nginx和javascri -
[52] Innodb分表太多或者表分区太多,会导致内 -
[51] 用 Jquery 模拟 select -
[50] CloudSMS:免费匿名的云短信 -
[48] 分享一个JQUERY颜色选择插件
