php再提文件锁定。

来源:互联网 发布:天猫和淘宝有什么关系 编辑:程序博客网 时间:2024/04/30 00:47
独立服务器出租400/月,有网通,电信,双线 | 黑客培训活动 | 十年专业防黑客团队 | 20G防ddos | 独家推出免杀空间 | 合租空间240元/1G 010-87003500  
首页 本类




再提文件锁定。

一个文本的发贴统计程序,count.txt文件纪录总发贴数量,流程为:
读取count.txt并递加1 --------> 回写
(锁定后读取) (解除锁定) (锁定后写入)
假设现在有两个进程对其进行操作:
ID 1 ID 2
锁定文件读取并递加
(解除锁定)
锁定文件读取并递加
(解除锁定)
回写
(解除锁定)
回写
(解除锁定)
这样这两个进程就出现了冲突,"ID 2"已经取代"ID 1"的操作,因为"ID 2"的读取数据恰好在"ID 1"的解除锁定和回写之间进行。这样就出现了数据丢失的问题。
以前并不在意这种问题,认为可能性非常小即使出错也无所谓,但刚才我测试过自己的程序,在访问量足够大的情况下就会出现这种问题(每秒3-4次操作)。
我认为唯一解决办法就是读取和回写过程在同一步完成,即读取后不解除锁定直接回写,曾尝试使用 fopen($this->NLX_FilePath, 'rw') 的方法,但不奏效。
希望各位就此问题进行讨论,研究解决办法!


用 一个没有这个痛的方法,操作数据库,所有的操作就没有这么麻烦了


Drate(同舟) 这可不是办法啊,做程序员怎么能逃避问题呢?呵呵


想到办法了。
再建立一个文件locktest.txt
程序流程这么写:
// +----------------------------------+
$lock_fp = fopen('locktest.txt', 'r');
flock($lock_fp, 2);
count.txt递加...
fclose($lock_fp);
// +----------------------------------+
这样就轻易的解决了锁定文件的空当。


新版本的php中flock函数已经不一样了
flock()
1 == LOCK_SH : 共享鎖定,即讀鎖定
2 == LOCK_EX: 完全鎖定,即寫鎖定
3 == LOCK_UN: 釋放鎖定
4 == LOCK_NB: 無阻礙鎖定
example:
flock($fp,LOCK_EX)
 
原创粉丝点击