PHP实现对文件锁进行加锁、解锁操作的方法
2017-07-04 08:56
751 查看
在项目中,一般都用到日志,如数据库查询日志、访问日志、对外接口请求返回参数日志,在处理日志时简单的写法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp);
但这种写法是由瑕疵的,一个网站同一时间并不是只有一个用户访问的,在多个用户同时访问时,就会出现问题,也就是多个进程使用同一个资源时,前一个进程写到一半后面的进程便开始写了,因此最后生成的日志就乱了。这种情况下,就用到锁了,在文件加锁期间,其他进程是不会修改文件的,只有当文件解锁时,才可以操作。写法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX);// 加锁 fwrite($fp, 'here'); flock($fp, LOCK_UN);// 解锁 fclose($fp);
如果想测试下在文件加锁期间其他进程操作不了文件的例子,可以用下面给出的demo
log.php
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX); fwrite($fp, 'here'); sleep(10); flock($fp, LOCK_UN); fclose($fp);
test.php
$file = 'lock.txt'; $fp = fopen($file, 'a'); fwrite($fp, 'good'); // 在sleep期间写不进去 fclose($fp); // 或是直接使用下面的这个例子,发现在sleep期间打印是个空值 //var_dump(file_get_contents($file));
测试时,先运行log.php,再运行test.php,会发现在sleep期间,test.php是执行达不到效果的。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php文件操作总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
您可能感兴趣的文章:
相关文章推荐
- php对大文件进行读取操作的实现代码
- php对大文件进行读取操作的实现代码
- php(创建、删除、移动、复制)文件及文件夹操作的实现方法
- 三种方法实现php网络请求(表单操作文件上传)
- Python3.6安装win32扩展并且实现对PPT文件进行截图操作的方法
- Python实现对PPT文件进行截图操作的方法
- php实现对两个数组进行减法操作的方法
- javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法
- java中,对文件进行追加内容操作的三种方法
- 20元实现随处wlan小教程(更新pc上操作M8文件的“另一种”方法)
- PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法
- 实现文件读写操作的几种方法
- php投票ajax实现(文件操作)
- PHP操作文件方法问答
- php文件操作常用函数或方法
- C#中将某一文件拖向应用程序后打开或进行其它操作的实现
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- javascript 操作文件 实现方法小结
- 新方法逐行读取文件并进行相应的操作
- 用PHP脚本在Linux系统上读取输入和对文件进行操作