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 ){ fwrite($handle, $text.'\n'); flock($handle, LOCK_UN); fclose($handle); //释放锁定操作 return true; } return false; }
其中flock(int $handle, int $operation)函数操作的 handle 必须是一个已经打开的文件指针。
operation 可以是以下值之一:
要取得共享锁定(读取的程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入的程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
此外, fclose()用来释放锁定操作,在代码执行完毕时调用。
相关推荐
-
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 $pid = pcntl_fork(); if($pid == -1){ //创建失败 die('could not fork'); } else{ if($pid){ //从这里开始写的代码是父进程的 exit("parent!"); } else{ //子进程代码,为防止不停的启用子进程造成系统资源被耗尽的情况,一般子进程代码运行完成后,加入exit来确保子进程正常退出. exit("child"); }
-
简单谈谈 php 文件锁
锁机制之所以存在是因为并发导致的资源竞争,为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争.假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性. 如果我们有两个程序同时向某个文件中写入数据,为了保证数据的完整性,可以加一个文件锁,先让程序1执行,程序1执行完后,解锁,再让程序2执行.实现代码如
-
PHP多进程编程实例
羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧.这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享. 1. 准备 在动手之前,请确定你用的不是M$ Windows平台(因为我没有Windows).Linux / BSD / Unix应该都是没问题的.确认好了工作环境以后一起来看看我们需要的PHP模块是否都有.打开终端输入下面的命令: 复制代码 代码如下
-
PHP 文件锁与进程锁的使用示例
鉴于前面介绍了swoole,就借用swoole的服务器/客户端与多进程机制对锁进行说明. 这里只针对PHP的锁机制进行说明,由于SQL的锁与其作用方式和应用场景不同,将作另行说明. 1.文件锁 flock() fclose() swoole_lock() 文件锁的可能应用场景为: 1.限制并发多进程或多台服务器需要对同一文件进行访问和修改; 2.对参与文件I/O的进程队列化和人为阻塞; 3.在业务逻辑中对文件内容进行守护; 下面是文件锁C/S通讯机制下的使用,已经省略了具体的通讯过程 Serve
-
PHP对文件进行加锁、解锁实例
有时候你的php脚本或许需要线程安全的保证,比如进行文件写操作的时候.本文提供了文件加锁函数以及使用示例.文件加锁功能也可以用来获得独享的处理空间,防止脚本执行发生同步错误. 复制代码 代码如下: <?php /************************************************************************* *file lock *@author Zeal Li *http://www.zeali.net/ * *****************
-
PHP session文件独占锁引起阻塞问题解决方法
PHP默认的会话处理器是session.save_handler = files(即文件).如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能.因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁.这样,同时多个请求就会引起阻塞.解决方案如下: (1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁. s
-
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程序中的文件锁、互斥锁、读写锁使用技巧解析
文件锁 全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题. 使用PID文件锁还有一个好处,方便进程向自己发停止或者重启信号.例如重启php-fpm的命令为 kill -USR2 `cat /usr
-
PHP基于文件锁解决多进程同时读写一个文件问题示例
本文实例讲述了PHP基于文件锁解决多进程同时读写一个文件问题.分享给大家供大家参考,具体如下: 首先PHP是支持进程的而不支持多线程(这个先搞清楚了),如果是对于文件操作,其实你只需要给文件加锁就能解决,不需要其它操作,PHP的flock已经帮你搞定了. 用flock在写文件前先锁上,等写完后解锁,这样就实现了多线程同时读写一个文件避免冲突.大概就是下面这个流程 /* *flock(file,lock,block) *file 必需,规定要锁定或释放的已打开的文件 *lock 必需.规定要使用哪
-
PHP文件锁函数flock()详细介绍
文件操作系统是在网络环境下完成的,可能有多个客户端用户在同一个时刻对服务器上的同一个文件访问.当这种并发访问产生时,很可能会破坏文件中.例如一个用户正在向文件中写入数据,当还没有写完时,其他用户在这一时刻也向这个文件中写数据,就会造成数据写入混乱.还有,当用户没有将数据写完时,其他用户就去获取这个文件中的内容,也会得到残缺的数据. 在PHP中提供了flock()函数,可以对文件使用锁定机制(锁定或释放文件).当一个进程在访问文件时加上锁,其他进程要想对该文件进行访问,则必须等到锁定被释放以后.这
随机推荐
- Cpy和Python的效率对比
- thinkphp中的多表关联查询的实例详解
- CentOS 7下配置Ruby语言开发环境的方法教程
- 收集的ROS防火墙脚本
- C#中的正则表达式双引号问题
- java实现屏蔽词功能
- 基于java中cookie和session的比较
- style、 currentStyle、 runtimeStyle区别分析
- 简略说明Javascript中的= =(等于)与= = =(全等于)区别
- spl_autoload_register与autoload的区别详解
- expect中为send语句上加变量的代码
- jQuery数据缓存用法分析
- Redis中实现查找某个值的范围
- python装饰器使用方法实例
- PHP针对伪静态的注入总结【附asp与Python相关代码】
- C#引用类型作为方法的参数分析
- WinForm下 TextBox只允许输入数字的小例子
- Java中==符号与equals()的使用详解(测试两个变量是否相等)
- asp.net调用系统设置字体文本框的方法
- android 使用uinput模拟输入设备的方法