php flock 使用实例

  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

  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

  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

  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

  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

  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

  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

  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

  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,当被锁定时,不阻塞,而是提示锁定。

php flock 使用实例的更多相关文章

  1. 使用JavaScript实现机器学习和神经学网络

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载heaton-javascript-ml.zip - 45.1 KB 基本介绍 在本文中,你会对如何使用JavaScript实现机器学习这个 ...

  2. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  3. php使用flock阻塞写入文件和非阻塞写入文件的实例讲解

    php使用flock阻塞写入文件和非阻塞写入文件的实例讲解: 阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test ...

  4. Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动

    断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ...

  5. flock — 轻便的咨询文件锁定

    bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] ) handle  文件系统指针,是典型地由 ...

  6. PHP读写文件高并发处理实例-转

    背景: 最近公司游戏开发需要知道游戏加载的流失率.因为,我们做的是网页游戏.玩过网页游戏的人都知道,进入游戏前要加载一些资源.最后才能到达创建角色的游戏界面.我们有一个需求就是要统计在加载过程中还未到 ...

  7. Linux编程之《只运行一个实例》

    概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...

  8. PHP学习笔记--文件目录操作(文件上传实例)

    文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...

  9. UNIX环境高级编程——单实例的守护进程

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h&g ...

随机推荐

  1. Xcode7.3打包ipa文件 报错和解决

    An error occurred during export. The file “xxx.ipa” couldn’t be opened because there is no such file ...

  2. <转载> Jquery的性能优化-实用!

    我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来 ========================= ...

  3. 绝对定位position: absolute;

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. urllib基本使用 urlopen(),Request

    urllib包含的常用模块:import urllib.request # 打开和读取url请求import urllib.error # 异常处理模块import urllib.parse # ur ...

  5. PHPCMS 前台移用地区联动数据

    在PHPCMS中,有时候需要建立模型有地区联动,这个联动数据在这前台调用显示呢?今天清源就给大家介绍一下! 地区联动菜单的缓存文件是  caches\caches_linkage\caches_dat ...

  6. Carrot2 in action 初步印象

    RawCluster:聚类中的类别单位 RawCluster.getDocuments():获得该类的文档列表 RawDocument:每个类的文档单位 STC:后缀树表示法 2008-11-13 C ...

  7. ASP.NET中RegisterStartupScript和RegisterClientScriptBlock有区别吗

    今天用RegisterClientScriptBlock()方法调用了alertify.js(绚丽的实现alert()同样的提示功能): Page.ClientScript.RegisterClien ...

  8. “线程安全的” Dictionary(TKey,TValue)

    这是一篇翻译,专门介绍Dictionary线程安全问题,原文网址如下 http://www.grumpydev.com/2010/02/25/thread-safe-dictionarytkeytva ...

  9. EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案

    背景分析 对于EasyNVR我们应该都了解,主要应用于互联安防直播,对于EasyNVR,我们可以清楚的发现,EasyNVR的工作机制是EasyNVR拉取摄像机的RTSP/Onvif视频流,然后客户端可 ...

  10. 解决Initializing Java Tooling 和 Initializing Java Tooling卡死问题

    遇到了如题的问题,使用如下方法解决了 工作中eclipse崩溃,再次启动后,状态栏一直显示  Initializing Javascript Tooling . 解决方案: 删除\workspace\ ...