简单谈谈 php 文件锁
锁机制之所以存在是因为并发导致的资源竞争,为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态。作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争。假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性。
如果我们有两个程序同时向某个文件中写入数据,为了保证数据的完整性,可以加一个文件锁,先让程序1执行,程序1执行完后,解锁,再让程序2执行。实现代码如下:
$fp = fopen('test.txt',"a"); $count = 10; if (flock($fp, LOCK_EX)) { for($i=1;$i<$count;$i++){ fwrite($fp, 'text2_'.$i."rn"); echo "test2".date('h:i:s') . " "; sleep(1); echo "test2".date('h:i:s'); } flock($fp , LOCK_UN); }else{ echo "Couldn't lock the file !"; } fclose($fp);
相关推荐
-
PHP文件锁函数flock()详细介绍
文件操作系统是在网络环境下完成的,可能有多个客户端用户在同一个时刻对服务器上的同一个文件访问.当这种并发访问产生时,很可能会破坏文件中.例如一个用户正在向文件中写入数据,当还没有写完时,其他用户在这一时刻也向这个文件中写数据,就会造成数据写入混乱.还有,当用户没有将数据写完时,其他用户就去获取这个文件中的内容,也会得到残缺的数据. 在PHP中提供了flock()函数,可以对文件使用锁定机制(锁定或释放文件).当一个进程在访问文件时加上锁,其他进程要想对该文件进行访问,则必须等到锁定被释放以后.这
-
PHP session文件独占锁引起阻塞问题解决方法
PHP默认的会话处理器是session.save_handler = files(即文件).如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能.因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁.这样,同时多个请求就会引起阻塞.解决方案如下: (1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁. s
-
PHP flock 文件锁详细介绍
flock (PHP 4, PHP 5) flock - 轻便的咨询文件锁定 说明 bool flock ( int $handle , int $operation [, int &$wouldblock ] ) PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法. Note: 在 Windows 下 flock() 将会强制执行. flock() 操作的 handle 必须是一个已经打开的文件指针.operation 可以是以下值之
-
PHP使用flock实现文件加锁的方法
本文实例讲述了PHP使用flock实现文件加锁的方法.分享给大家供大家参考.具体分析如下: flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而
-
PHP实现对文件锁进行加锁、解锁操作的方法
本文实例讲述了PHP实现对文件锁进行加锁.解锁操作的方法.分享给大家供大家参考,具体如下: 在项目中,一般都用到日志,如数据库查询日志.访问日志.对外接口请求返回参数日志,在处理日志时简单的写法如下 $file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp); 但这种写
-
PHP对文件进行加锁、解锁实例
有时候你的php脚本或许需要线程安全的保证,比如进行文件写操作的时候.本文提供了文件加锁函数以及使用示例.文件加锁功能也可以用来获得独享的处理空间,防止脚本执行发生同步错误. 复制代码 代码如下: <?php /************************************************************************* *file lock *@author Zeal Li *http://www.zeali.net/ * *****************
-
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
文件锁 全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题. 使用PID文件锁还有一个好处,方便进程向自己发停止或者重启信号.例如重启php-fpm的命令为 kill -USR2 `cat /usr
-
PHP 文件锁与进程锁的使用示例
鉴于前面介绍了swoole,就借用swoole的服务器/客户端与多进程机制对锁进行说明. 这里只针对PHP的锁机制进行说明,由于SQL的锁与其作用方式和应用场景不同,将作另行说明. 1.文件锁 flock() fclose() swoole_lock() 文件锁的可能应用场景为: 1.限制并发多进程或多台服务器需要对同一文件进行访问和修改; 2.对参与文件I/O的进程队列化和人为阻塞; 3.在业务逻辑中对文件内容进行守护; 下面是文件锁C/S通讯机制下的使用,已经省略了具体的通讯过程 Serve
-
PHP基于文件锁解决多进程同时读写一个文件问题示例
本文实例讲述了PHP基于文件锁解决多进程同时读写一个文件问题.分享给大家供大家参考,具体如下: 首先PHP是支持进程的而不支持多线程(这个先搞清楚了),如果是对于文件操作,其实你只需要给文件加锁就能解决,不需要其它操作,PHP的flock已经帮你搞定了. 用flock在写文件前先锁上,等写完后解锁,这样就实现了多线程同时读写一个文件避免冲突.大概就是下面这个流程 /* *flock(file,lock,block) *file 必需,规定要锁定或释放的已打开的文件 *lock 必需.规定要使用哪
-
深入探究PHP的多进程编程方法
子进程的创建 一般的子进程的写法是: <?php $pid = pcntl_fork(); if($pid == -1){ //创建失败 die('could not fork'); } else{ if($pid){ //从这里开始写的代码是父进程的 exit("parent!"); } else{ //子进程代码,为防止不停的启用子进程造成系统资源被耗尽的情况,一般子进程代码运行完成后,加入exit来确保子进程正常退出. exit("child"); }
-
PHP多进程编程实例
羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧.这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享. 1. 准备 在动手之前,请确定你用的不是M$ Windows平台(因为我没有Windows).Linux / BSD / Unix应该都是没问题的.确认好了工作环境以后一起来看看我们需要的PHP模块是否都有.打开终端输入下面的命令: 复制代码 代码如下
-
PHP文件锁定写入实例解析
本文以实例讲述了PHP文件写入方法,以应对多线程写入,具体代码如下: function file_write($file_name, $text, $mode='a', $timeout=30){ $handle = fopen($file_name, $mode); while($timeout>0){ if ( flock($handle, LOCK_EX) ) { // 排它性的锁定 $timeout--; sleep(1); } } if ( $timeout > 0 ){ fwrit
随机推荐
- AngularJS 过滤器(自带和自建)详解
- AngularJS 整理一些优化的小技巧
- php strstr查找字符串中是否包含某些字符的查找函数
- 如何直接访问php实例对象中的private属性详解
- DB2编程序技巧 (四)
- 让angularjs支持浏览器自动填表
- 解决AngualrJS页面刷新导致异常显示问题
- vbs重启TP-Link路由器示例
- jQuery的内容过滤选择器学习教程
- 基于ajax实现文件上传并显示进度条
- JS实现控制表格行文本对齐的方法
- Android实现读取相机(相册)图片并进行剪裁
- Python爬虫辅助利器PyQuery模块的安装使用攻略
- asp下实现替换远程文件为本地文件并保存远程文件的代码
- jsp实现上一页下一页翻页功能(示例代码)
- C#编程中使用ref和out关键字来传递数组对象的用法
- mysql记录根据日期字段倒序输出
- MySQL创建和删除数据库的命令及相关PHP脚本的操作方法
- PHP中的use关键字及文件的加载详解
- file_get_contents获取不到网页内容的解决方法