php 文件锁
当写为LOCK_EX锁 且 读为LOCK_SH锁时最为妥当,经测试,这时情况如下:
1, 先运行w.php,马上支行r.php 后 程序会先等写入后再读取
2, 先运行r.php,再马上支行w.php后 当写操作执行LOCK_EX时就已经把文件内容清空,LOCK_SH并不会影响写操作清空,也就是说具体流程如下:
a) 运行r.php ,加LOCK_SH锁 , 马上支行w.php,加LOCK_SH,文件被清空
b) 等待r.php读出为空,运行完毕后,w.php再开始运行,完毕
3,如果将第二步中的w.php中的 fwrite换成a就可以先读出原有的,等读完后,写才执行
4,如果两个都读 或都写,那么就按 先后顺序等待执行
其中很像队列机制
最后解决办法,在同一锁内读后再写,可以解决并发冲突:
<?php
@ini_set('implicit_flush',1);
ob_implicit_flush(1);
@ob_end_clean(); $file = "temp.txt";
$fp = fopen($file, 'r+');
flock($fp, LOCK_EX) or die("lock error"); echo '<br />LOCK_EX 哥先读5s....'; for ($i=5; $i>0; --$i)
{
echo $i;
sleep(1);
} echo '<br />'.fread($fp, 100);
echo '<br /> 被读了出来 ,LOCK_UN'; fwrite($fp ,'#'); //然后指针到文件尾,此时再写入文件尾部
echo '<br />#';
flock($fp, LOCK_UN);
fclose($fp);
?> --------------以上是把在文件末尾加新写入的内容----------------
有的时候我们需要将写入的内容写在文件头(当然由于指针问题会覆盖):
<?php
//计算文件大小
echo filesize('temp.txt');
$fp = fopen('temp.txt', 'r+'); flock($fp, LOCK_EX);
fwrite($fp, '10001');
sleep(2);
$str = fread($fp , 1024 * 100);
echo 'content : ' . $str; flock($fp, LOCK_UN);
?>
这时候的好处是文件的大小不会变大,方便打开和读取,我在计算幸运数据为减轻服务器压力就是这样写的
php 文件锁的更多相关文章
- php文件锁
前言 1.锁机制之所以存在是因为并发问题导致的资源竞争,为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP 的文件锁也是为了应对资源竞争.假设一个应用场景 ...
- JAVA NIO简介-- Buffer、Channel、Charset 、直接缓冲区、分散和聚集、文件锁
IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. Java标准io回顾 在Java1.4之前的I/O系统中,提供 ...
- Linux文件锁flock
Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...
- JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁
NIO机制 NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio. 在ja ...
- Linux 文件锁
当多个进程同时访问操作同一个文件时,我们怎么保证文件数据的正确性. linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态. 文件锁包括建议性锁和强制性的锁: 建议性的锁 :顾名思义,相对温 ...
- php中并发读写文件冲突的解决方案(文件锁应用示例)
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- php原子操作,文件锁flock,数据库事务
php原子操作,文件锁flock,数据库事务 php没有继承posix标准支持的unix锁,只封装了一个linux系统调用flock(信号量也能做成锁),按理也是可以使用锁机制的,虽然效率低一点.ph ...
- linux文件锁
http://blog.chinaunix.net/uid-25324849-id-3077304.html 在SHELL中实现文件锁,有两种简单的方式.(1)一是利用普通文件,在脚本启动时检查特定文 ...
- linux使用flock文件锁解决crontab冲突问题
* * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...
- Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏
1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足. 1.1 相关函数 #include <pthread.h> pthread_cond_t cond ...
随机推荐
- oracle数据库常用语句
--查看数据库版本-- select * from product_component_version; -- 查看dbf存放位置 select * from dba_data_files; -- 查 ...
- 兵家必争之地——关于O2O商业模式的一点遐想
先来说说什么是O2O(online to offline)商业模式.创新工场CEO李开复在提及O2O模式时指出,“你如果不知道O2O至少知道团购,但团购只是冰山一角,只是第一步”.O2O营销模式又称离 ...
- PL/SQL错误提示 database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different 这是由于安装oracl ...
- CentOS 7如何连接无线网络
虽然查阅了相关网络资料,但是以下内容均为原创内容,只有干货,无废话. 1.切换到超级用户 [Oscar@localhost 桌面]$ su root 2.查询可用的无线网卡,其中红色为网卡号 [Osc ...
- delphi 调用百度地图api
一.调用javascript的方法 两种: 第一种:采用自编函数的方法 function ExecuteJavaScript(WebBrowser:TWebBrowser; Code: string) ...
- 根据 MySQL 状态优化 ---- 4. 临时表
查看 MySQL 服务器运行的各种状态值: mysql> show global status: 4. 临时表 查看设置: mysql> show variables where Vari ...
- Python 配置日志
Python 2.6+ def cfgLogging(): from logging.handlers import RotatingFileHandler console = logging.Str ...
- (转)C#调用默认浏览器打开网页的几种方法
转载,原文地址:http://blog.csdn.net/testcs_dn/article/details/42246969 CSharp调用默认浏览器打开网页的几种方法 示例界面: 方法一:从注册 ...
- Windows消息过滤
在C#编程中,经常会遇到一些场景,如禁止鼠标拖动窗体,启用某些快捷键,禁止鼠标移动等.遇到这些需求,可以通过窗体的MouseMove事件,OnDragDrop,OnMove等事件来解决问题, 但是该方 ...
- Python-8 元组tuple
#1 特殊的列表:元组 元组中的元素不可改变 #2 创建.访问 >>> tuple1=(1,2,3) >>> tuple1=1,2,3 >>> t ...