php flock 使用实例

[php] view plaincopy
  1. bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

flock()允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的Unix派生版和windows)

在PHP 5.3.2版本之前,锁会被 fclose() 释放(在脚本结束后会自动调用),现在需要手动解锁

operation

1.LOCK_SH 取得共享锁(读取的程序)

2.LOCK_EX 取得独占锁(写入的程序)

3.LOCK_UN 释放锁定 (无论共享或独占)

4.LOCK_NB 在flock()锁定时不阻塞

实例1:A使用独占锁写文件,B读取文件,阻塞

a.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'w');
  4. if(flock($fp, LOCK_EX)){            // 取得独占锁
  5. fwrite($fp, "Hello World\r\n"); // 写入数据
  6. sleep(10);                      // sleep 10秒,文件被锁定
  7. fwrite($fp, "Hello PHP\r\n");   // 写入数据
  8. flock($fp, LOCK_UN);            // 解锁
  9. }
  10. fclose($fp);
  11. ?>

b.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'r');
  4. if(flock($fp, LOCK_SH)){ // 取得贡献锁
  5. while(!feof($fp)){
  6. echo fread($fp, 100);
  7. }
  8. flock($fp, LOCK_UN);
  9. }
  10. fclose($fp);
  11. ?>

先执行a.php,然后执行b.php

a取得独占锁,b只能等待,等a执行完解除锁定后才能执行b,阻塞

实例2:A,B都使用共享锁,不阻塞

a.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'r');
  4. if(flock($fp, LOCK_SH)){ // 取得共享锁
  5. sleep(10);           // sleep 10秒
  6. while(!feof($fp)){
  7. echo fread($fp, 100);
  8. }
  9. flock($fp, LOCK_UN);
  10. }
  11. fclose($fp);
  12. ?>

b.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'r');
  4. if(flock($fp, LOCK_SH)){ // 取得共享锁
  5. while(!feof($fp)){
  6. echo fread($fp, 100);
  7. }
  8. flock($fp, LOCK_UN);
  9. }
  10. fclose($fp);
  11. ?>

先执行a.php,然后执行b.php

b不需要等待a执行完就能输出文件内容,非阻塞

实例3:A,B都使用独占锁写文件,阻塞

a.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'a');
  4. if(flock($fp, LOCK_EX)){            // 取得独占锁
  5. fwrite($fp, "Hello World\r\n"); // 写入数据
  6. sleep(10);                      // sleep 10秒,文件被锁定
  7. fwrite($fp, "Hello PHP\r\n");   // 写入数据
  8. flock($fp, LOCK_UN);            // 解锁
  9. }
  10. fclose($fp);
  11. ?>

b.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'a');
  4. if(flock($fp, LOCK_EX)){                    // 取得独占锁
  5. fwrite($fp, "How Are You\r\n");         // 写入数据
  6. fwrite($fp, "Show Me The Money\r\n");   // 写入数据
  7. flock($fp, LOCK_UN);                    // 解锁
  8. }
  9. fclose($fp);
  10. ?>

先执行a.php,然后执行b.php

b需要等待a执行完,才能写入数据,阻塞

实例4:LOCK_NB 锁定时不阻塞,不等待

a.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'a');
  4. if(flock($fp, LOCK_EX)){            // 取得独占锁
  5. fwrite($fp, "Hello World\r\n"); // 写入数据
  6. sleep(10);                      // sleep 10秒,文件被锁定
  7. fwrite($fp, "Hello PHP\r\n");   // 写入数据
  8. flock($fp, LOCK_UN);            // 解锁
  9. }
  10. fclose($fp);
  11. ?>

b.php

[php] view plaincopy
  1. <?php
  2. $file = 'test.txt';
  3. $fp = fopen($file, 'a');
  4. if(flock($fp, LOCK_EX|LOCK_NB)){            // 取得独占锁
  5. fwrite($fp, "How Are You\r\n");         // 写入数据
  6. fwrite($fp, "Show Me The Money\r\n");   // 写入数据
  7. flock($fp, LOCK_UN);                    // 解锁
  8. }else{
  9. echo 'file locked';
  10. }
  11. fclose($fp);
  12. ?>

先执行a.php,然后执行b.php

b取不到独占锁,不需要等待a执行完,而是直接返回取不到锁提示,非阻塞

总结:

使用共享锁LOCK_SH,如果是读取,不需要等待,但如果是写入,需要等待读取完成。

使用独占锁LOCK_EX,无论写入/读取都需要等待。

LOCK_UN,无论使用共享/读占锁,使用完后需要解锁。

LOCK_NB,当被锁定时,不阻塞,而是提示锁定。

转载于:https://www.cnblogs.com/microtiger/p/9104878.html

php flock 使用实例相关推荐

  1. 前端开发基础知识汇总

    一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...

  2. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

  3. 通过文件锁 Lockfile/flock 让脚本单实例运行

    2019独角兽企业重金招聘Python工程师标准>>> 1.Perl File::Lockfile 模块 用Perl写了一些监控脚本,放在crontab中调度执行.有时候会发现一个脚 ...

  4. linux下C程序:运行单个实例

    2019独角兽企业重金招聘Python工程师标准>>> 对于很多服务来说,在同一个服务器上只能运行一个实例,那么通过什么方法来保证程序同一时刻只有一个实例运行呢?通过编写shell脚 ...

  5. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  6. python 单一进程实例 实现

    目录 一.说明 二.单进程实例实现 2.1 Linux平台实现--使用标准库fcntl 2.2 通用平台实现--使用第三方库portalocker 三.单例模式实现 3.1 单例模式示例代码 3.2  ...

  7. 27.13. flock - manage locks from shell scripts

    ### flock 当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有在操作,以免损坏数据.通常,这样的进程会使用一个"锁文件",也就是建立一个文件来告诉别的进程 ...

  8. php 查看文件锁定状态_PHP flock 文件锁详细介绍

    flock (PHP 4, PHP 5) flock - 轻便的咨询文件锁定 说明 bool flock ( int $handle , int $operation [, int &$wou ...

  9. php 覆盖写文件内容,php写入文件不覆盖的实例讲解

    php写入文件不覆盖的实例讲解 file_put_contents():向文件中写入内容并且不覆盖之前的内容. 步骤: 1.新建文件 2.声明要写入内容的文件 3.这个文件的内容如图 4.file_g ...

最新文章

  1. 近 100 场专题演讲、14 大沉浸式应用场景…别不信!这是真·烧脑技术盛会
  2. linux压缩与解压缩命令
  3. 虚拟主机的301重定向
  4. Hibernate 4.3 ORM工具
  5. C语言fgets函数了解
  6. 我的git仓库,顺记github配置
  7. cocos2dx游戏开发简单入门视频教程 (cocos2d-x)- 第5天
  8. 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
  9. AE光效插件Optical Flares for Mac出现不显示预览缩略图,如何解决
  10. 全世界时差整理(不含夏冬令时)
  11. 地图坐标系统(各种坐标系详解)
  12. 应用不能远程访问RabbitMQ的5672端口
  13. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)
  14. Matlab许可证过期解决办法
  15. 用python计算整数各位数字之和
  16. 盛世传承“富三代”品牌让你的家族基业长青
  17. 【沧小海笔记】之基于FPGA的以太网设计相关知识——第三章 xilinx 三速以太网IP核(TEMAC)的介绍
  18. shell版本爬取NVD网站信息
  19. ionic cordova实现获取显示手机通讯录
  20. java高级软件工程师面试题

热门文章

  1. 【leetcode】Merge Sorted Array
  2. 推荐一本学习Groovy的书籍Groovy程序设计!
  3. 关于企业费控管理的这些陷阱,你知道吗?
  4. 浅谈Borg/YARN/Mesos/Torca/Corona一类系统
  5. ovirt 添加存储域错误提示
  6. C#常见算法题目(面试准备)
  7. 量子计算机退相干问题怎么办,量子退相干
  8. 第一个案例实操——WordCount
  9. 面试题01.02 判定是否互为字符重排
  10. 数据治理需要注意什么问题