php flock 使用实例
php flock 使用实例
- 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
- $file = 'test.txt';
- $fp = fopen($file, 'w');
- if(flock($fp, LOCK_EX)){ // 取得独占锁
- fwrite($fp, "Hello World\r\n"); // 写入数据
- sleep(10); // sleep 10秒,文件被锁定
- fwrite($fp, "Hello PHP\r\n"); // 写入数据
- flock($fp, LOCK_UN); // 解锁
- }
- fclose($fp);
- ?>
b.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'r');
- if(flock($fp, LOCK_SH)){ // 取得贡献锁
- while(!feof($fp)){
- echo fread($fp, 100);
- }
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- ?>
先执行a.php,然后执行b.php
a取得独占锁,b只能等待,等a执行完解除锁定后才能执行b,阻塞
实例2:A,B都使用共享锁,不阻塞
a.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'r');
- if(flock($fp, LOCK_SH)){ // 取得共享锁
- sleep(10); // sleep 10秒
- while(!feof($fp)){
- echo fread($fp, 100);
- }
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- ?>
b.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'r');
- if(flock($fp, LOCK_SH)){ // 取得共享锁
- while(!feof($fp)){
- echo fread($fp, 100);
- }
- flock($fp, LOCK_UN);
- }
- fclose($fp);
- ?>
先执行a.php,然后执行b.php
b不需要等待a执行完就能输出文件内容,非阻塞
实例3:A,B都使用独占锁写文件,阻塞
a.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'a');
- if(flock($fp, LOCK_EX)){ // 取得独占锁
- fwrite($fp, "Hello World\r\n"); // 写入数据
- sleep(10); // sleep 10秒,文件被锁定
- fwrite($fp, "Hello PHP\r\n"); // 写入数据
- flock($fp, LOCK_UN); // 解锁
- }
- fclose($fp);
- ?>
b.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'a');
- if(flock($fp, LOCK_EX)){ // 取得独占锁
- fwrite($fp, "How Are You\r\n"); // 写入数据
- fwrite($fp, "Show Me The Money\r\n"); // 写入数据
- flock($fp, LOCK_UN); // 解锁
- }
- fclose($fp);
- ?>
先执行a.php,然后执行b.php
b需要等待a执行完,才能写入数据,阻塞
实例4:LOCK_NB 锁定时不阻塞,不等待
a.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'a');
- if(flock($fp, LOCK_EX)){ // 取得独占锁
- fwrite($fp, "Hello World\r\n"); // 写入数据
- sleep(10); // sleep 10秒,文件被锁定
- fwrite($fp, "Hello PHP\r\n"); // 写入数据
- flock($fp, LOCK_UN); // 解锁
- }
- fclose($fp);
- ?>
b.php
- <?php
- $file = 'test.txt';
- $fp = fopen($file, 'a');
- if(flock($fp, LOCK_EX|LOCK_NB)){ // 取得独占锁
- fwrite($fp, "How Are You\r\n"); // 写入数据
- fwrite($fp, "Show Me The Money\r\n"); // 写入数据
- flock($fp, LOCK_UN); // 解锁
- }else{
- echo 'file locked';
- }
- fclose($fp);
- ?>
先执行a.php,然后执行b.php
b取不到独占锁,不需要等待a执行完,而是直接返回取不到锁提示,非阻塞
总结:
使用共享锁LOCK_SH,如果是读取,不需要等待,但如果是写入,需要等待读取完成。
使用独占锁LOCK_EX,无论写入/读取都需要等待。
LOCK_UN,无论使用共享/读占锁,使用完后需要解锁。
LOCK_NB,当被锁定时,不阻塞,而是提示锁定。
php flock 使用实例的更多相关文章
- 使用JavaScript实现机器学习和神经学网络
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载heaton-javascript-ml.zip - 45.1 KB 基本介绍 在本文中,你会对如何使用JavaScript实现机器学习这个 ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解: 阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test ...
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动
断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ...
- flock — 轻便的咨询文件锁定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) handle 文件系统指针,是典型地由 ...
- PHP读写文件高并发处理实例-转
背景: 最近公司游戏开发需要知道游戏加载的流失率.因为,我们做的是网页游戏.玩过网页游戏的人都知道,进入游戏前要加载一些资源.最后才能到达创建角色的游戏界面.我们有一个需求就是要统计在加载过程中还未到 ...
- Linux编程之《只运行一个实例》
概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...
- PHP学习笔记--文件目录操作(文件上传实例)
文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...
- UNIX环境高级编程——单实例的守护进程
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h&g ...
随机推荐
- Failed to load the JNI shared library jvm.dl
. 原因1:该目录下jvm.dll不存在 2 解决办法:重新安装jdk或者jre并配置好环境变量.copy一个jvm.dll放在该目录下 3 原因2:eclipse的版本与jdk或者jre版本不一致 ...
- Android Studio使用百度地图问题总结
一.常见问题APP Scode码校验失败 一般出现这个问题都是ak不正确导致 可能出错的地方 1.SHA1值没有正确获取 正确获取SHA1值:在左下角打开Terminal终端,进入debug.keys ...
- java用iText导出word文档
1.需要导入的jar包 2.导出word并下载其实是分两步的. 第一步是将需要导出的数据导出(上传)到服务器上 第二步是将服务器上的文档下载到本地 3. 第一步.上传文档 (1)设置响应信息以及构造上 ...
- 防sql注入之参数绑定 SQL Injection Attacks and Defense
http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...
- MySQL 第六天
回顾 外键: 关联关系(表与表之间: 表中字段指向另外一张表的主键) 外键条件: 字段类型必须一致, 存储引擎必须为innodb 外键约束: 子表约束: 不能插入父表不存在的记录 父表约束: 三种 ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- Android程序运行时权限与文件系统权限的区别
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置. (1)Android中的apk必须签名 (2)基于UserID的进程级别的安全机 ...
- [LeetCode-21]Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...
- AndroidStudio项目import进的包都是红色的
今天在开发项目时,一不留神,项目中import部分的内容全部变成了灰色,最后的类名却都变成了红色,如图: 一时之间,懵逼了~~~.Alt+Enter快捷键导包竟然是这个样子的@_@: 这简直就没见过 ...
- Log4j详细配置解释
原文地址:https://www.cnblogs.com/godtrue/p/6444158.html log4j(七)——log4j.xml简单配置样例说明 一:测试环境与log4j(一)——为什么 ...