≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > PHP笔记

php 使用flock函数锁定文件的简单示例

人气:769 时间:2018-09-23

这篇文章主要为大家详细介绍了php 使用flock函数锁定文件的简单示例,具有一定的参考价值,可以用来参考一下。

对php技巧使用flock函数锁定文件感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!
在多用户环境(例如Web服务器)中,多个用户可能同时访问脚本-- 这就意味着相同脚本的多个副本在同时运行。如果脚本访问文件,在两个脚本或相同脚本的两个副本尝试同时写入同一个文件时,就会产生冲突。为了解决这个问题,可以使用文件锁定函数flock:
先看php手册对flock的说明: bool flock ( int handle, int operation [, int &wouldblock] ) PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。
注: 在 Windows 下 flock() 将会强制执行。 flock() 操作的 handle 必须是一个已经打开的文件指针。
operation 可以是以下值之一:
要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为4)。
flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。
如果成功则返回 TRUE,失败则返回 FALSE 例: flock (handle, operation [, &wouldblock] )

/**
 * php技巧使用flock函数锁定文件
 *
 * @param 
 * @arrange 512-笔记网: q1010.com
 **/
$handle = fopen("data.txt", "w"); 
$text = "Here\nis\nthe\ntext."; 
if (flock($handle, LOCK_EX | LOCK_NB)) { 
. 
. 
. 
} 

/***   来自四海网(www.q1010.com)   ***/
其中,handle是要锁定文件的句柄,而operation可以有以下几种值: 要获得共享锁(读取程序),可将operation设为LOCK_SH 要获得独占锁(写入程序),可将operation设为LOCK_EX 要释放锁(共享锁或独占锁),可将operation设为LOCK_UN 如果锁被阻塞,可选的第三个参数将被设置为TRUE。 如果获得一个锁,函数将返回TRUE,否则返回FALSE。
用户能以咨询方式锁定文件-- 所有文件访问代码必须查看是否可以在访问文件之前获取文件的锁。如果代码不能获取文件的锁,则表明其他一些代码正在使用该文件,当前代码就必须等待。
锁采用咨询方式(而在Windows下,锁采用强制方式),这就意味着其他代码能够操作锁定的文件-- 而这可能会把事情搞得很糟糕-- 所以必须确保在写入文件之前尝试获取锁。在完成对文件的操作后,解除锁定文件,从而使其他代码可以访问该文件。
函数flock通常阻塞(即不返回),直到获得安全的锁。如果不想等待-- 并且可能挂起代码-- 则应该对常量LOCK_NB和该操作执行OR操作,例如:LOCK_EX | LOCK_NB。这将使函数flock立刻返回。
而如果没有获取锁,可以等待1秒钟(像下面这样使用PHP的sleep函数:sleep(1),该函数将使代码暂停1秒钟),然后再尝试。尝试15次之后将超时。

下面这个示例phpflock.php在写入文件data.txt之前就锁定该文件。打开文件,像下面这样尝试获得锁:

/**
 * php技巧使用flock函数锁定文件
 *
 * @param 
 * @arrange 512-笔记网: q1010.com
 **/
$handle = fopen("data.txt", "w"); 
$text = "Here\nis\nthe\ntext."; 
if (flock($handle, LOCK_EX | LOCK_NB)) { 
. 
. 
. 
} 

/***   来自四海网(www.q1010.com)   ***/
如果获得锁,就可以写入该文件,然后对该文件解除锁定:

/**
 * php技巧使用flock函数锁定文件
 *
 * @param 
 * @arrange 512-笔记网: q1010.com
 **/
$handle = fopen("data.txt", "w"); 
$text = "Here\nis\nthe\ntext."; 
if (flock($handle, LOCK_EX | LOCK_NB)) { 
echo "Locked the file. <br>"; 
if (fwrite($handle, $text) == FALSE) { 
echo "Can not write data.txt. <br>"; 
} 
else { 
echo "Created data.txt. <br>"; 
} 
flock($handle, LOCK_UN); 
echo "Unlocked the file. <br>";
} 

/***   来自四海网(www.q1010.com)   ***/
这段代码只尝试锁定文件一次。如果不能锁定文件,将立即显示错误。可以遍历15或20秒钟,尝试继续锁定文件直至放弃。 如果不能获得锁,则表明其他代码正在使用这个文件,在phpflock.php中应该像下面这样提示用户:

/**
 * php技巧使用flock函数锁定文件
 *
 * @param 
 * @arrange 512-笔记网: q1010.com
 **/
<html> 
<head> 
<title> 
Locking and unlocking files 
</title> 
</head> 
<body> 
<h1> 
Locking and unlocking files 
</h1> 
<?php 
$handle = fopen("data.txt", "w"); 
$text = "Here\nis\nthe\ntext."; 
if (flock($handle, LOCK_EX | LOCK_NB)) { 
echo "Locked the file. <br>"; 
if (fwrite($handle, $text) == FALSE) { 
echo "Can not write data.txt. <br>";
} 
else { 
echo "Created data.txt. <br>"; 
} 
flock($handle, LOCK_UN); 
echo "Unlocked the file. <br>"; 
} 
else { 
echo "Could not lock the file. <br>"; 
} 
fclose($handle); 
?> 
</body> 
</html> 
/***   来自四海网(www.q1010.com)   ***/
现在就完成了所有操作。其中显示了锁定文件,然后写入文件,最后解锁文件。

本文来自:http://www.q1010.com/173/1175-0.html

注:关于php 使用flock函数锁定文件的简单示例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:flock

您可能感兴趣的文章

  • PHP flock 文件锁用法示例
上一篇:PHP 编码转换函数mb_convert_encoding与iconv的简单示例
下一篇:PHP strtok()函数优点解析
热门文章
  • PHP 写入WRITE编码为UTF8的文件示例
  • PHP 中文字符串截取函数示例:支持gb2312,gbk,big
  • PHP 简单留言板的制作示例
  • 解决Fatal error: Call to undefined function mb_convert_encoding() in错误问题
  • PHP语言基础(标记、注释、变量、数组、常量、函数)示例
  • php 生成迅雷链接的简单示例
  • php 获取短网址的实现方法
  • PHP 通用分页类的简单示例
  • PHP 使用文件方式导入导出整个MYSQL数据库的实现方法
  • php 获取MYSQL错误的简单示例
  • 最新文章
    • 解决PHP使用redis实现统计缓存MySQL压力的问题
    • php 简单的上传进度条的简单示例
    • php 给html中引用的js和css路径打上版本号的实现方法
    • php 实现计算年龄精准到年月日的实例
    • php+ajax无刷新分页的简单示例
    • 解决php+ajax无刷新上传图片的问题
    • 解决PHP生成HTML静态页面的问题
    • 解决PHP使用uniqid函数生成唯一ID的问题
    • 解决PHP防刷票的一些问题
    • 微信access_token的获取开发的实现方法

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。