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 ...
随机推荐
- .NET加密方法
SHA1加密: string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp);//字典排序 string tmpStr = str ...
- mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...
- 【转】Oracle表分区
源地址:http://love-flying-snow.iteye.com/blog/573303
- 【javascript进阶】异常
前言 最近有些时间了,今天看了看博客的后台记录,好多都没有写博客呢,争取尽快把以前的补上,javascrit中的异常在前端大家用的好像不是很多,其实javascript的异常和大多数的后端语言差不大, ...
- Django 之 分表
app名称为'core',基本的models.py文件内容如下: class Province(models.Model): name = models.CharField(u'省份名称',max_l ...
- Logstash5.0.X离线安装插件报错,仍然提示无法联网
本人最初将此解决方案发布在 ELK中文社区 http://elasticsearch.cn/question/1046 由于生产环境无法连接互联网,所有再一台联网机器上将所有插件做了 pack 拖到生 ...
- pyqt5安装
花了一天时间,终于是装好了. 这东西硬是把我从Python2掰弯成了Python3 本来用pip安装了一个pyqt,但是后来才发现,这是个x64版本的. 我不知道啊! 我以为是还要装qt5 所以我把q ...
- Windows 7 添加MBR文件启动
bcdedit /create /d "Solaris" /application bootsector后会出现标识符如{26224d85-dbcc-11e4-86a8-e164d ...
- Java面向对象㈢ -- 内部类
内部类必须要依赖于继承或实现一个接口.内部类可以实现Java多继承,内部类访问外表类的局部变量或参数时,则该局部变量或参数必须被final修饰.内部类不能包含有static的变量和方法,原因是因为内部 ...
- 页面动态table动态合并table
function hebingRows(col, atrrb) { var trs = $("table tbody tr"); var rows = 1; for (var i ...