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
$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
$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
$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
$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
$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
$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
$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
$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
,当被锁定时,不阻塞,而是提示锁定。
共享锁允许多个进程同时对文件进行读操作,而独占锁则只允许一个进程对文件进行写操作。通过
使用
f
lock
函数,我们可以实现在
PHP
中对文件进行加锁的功能。在实际应用中,根据需要进行适当的错误处理和等待策略,以确保获取锁的成功率和系统的稳定性。文件加锁的概念是在对文件进行操作时,通过获取锁的方式来确保同一时间只有一个进程或线程可以访问该文件。除了独占锁外,还可以
使用
共享锁对文件进行加锁。共享锁允许多个进程同时对文件进行读操作,适用于多个进程需要同时读取文件内容的场景。希望本文对您理解
PHP
中的文件加锁有所帮助。
php
是原生支持多进程编程的,可以利用pcntl_fork()在当前位置产生一个子进程,那么就可能存在多个进程读写同一个文件的问题,比如多进程程序读写同一个日志文件,这样就有必要解决读写同一个文件时加锁的问题,
php
已经内置了一个读写的文件锁方法f
lock
,,官方的解释是轻便的文件咨询锁定,这很官方。
还是先看一个栗子吧:
<?
php
$fp = fopen("logs/app.
一、
使用
示例不阻塞文件锁定,如果锁定失败,则单独处理相应逻辑$handle = fopen("j:/test.txt","r+"); //读写方式打开文件if ( $handle ) {$
lock
= true; //windows 平台该参数无效if( f
lock
($handle,
LOCK
_
SH
|
LOCK
_
NB
,$
lock
) ) { //
使用
共享锁定,其他请求可以直接进入,
LOCK
_
NB
...
//数据同步锁保证数据的同步操作private static
Lock
lock
=new Reentrant
Lock
();//设置代码块同步锁
lock
.
lock
();try {// 需要同步的代码块}finally {//废除锁
lock
.un
lock
();}1、Reentrant
Lock
拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获...
f
lock
在
php
中的作用是操作文件时锁定文件,只取取消锁定时才可用。f
lock
在
php
中的作用是操作文件时锁定文件,只取取消锁定时才可用。f
lock
(
PHP
4中,
PHP
5中)f
lock
-便携式咨询文件锁定描述布尔群(资源$处理,诠释$操作[摘要& $ wouldb
lock
] )f
lock
( )可让您执行一个简单的读卡器/写模式,它可以用在几乎所有平台(包括大多数Unix衍生物甚至Win...
场景
php
进程锁可以解决很多业务场景.典型的比如crontab脚本防重叠比如做搞并发计数器类似的写数据操作行为可以用方法f
lock
(file,
lock
,b
lock
)参数描述file必需。规定要锁定或释放的已打开的文件。
lock
必需。规定要
使用
哪种锁定类型。b
lock
可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。说明f
lock
() 操作的 file 必须是一个已经打开的文件指针。lo...
实例
/***Cache
Lock
进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库*用于解决
PHP
在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定*如果没有
使用
eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁*
使用
了eaccelerator则在内存中处理,性能相对较高*不同的锁之间并行执行,类似my...
php
中文件锁函数f
lock
函数用法简介:
bool f
lock
( int $handle , int $operation [, int &$wouldb
lock
] )
f
lock
() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:
1. 要取得共享锁定(读取程序),将 operation 设为
LOCK
_
SH
(
PHP
4.
www.111cn.net 编辑:angel 来源:转载
为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态。作为锁机制中的一种,
PHP
的文件锁也是为了应对资源竞争。假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的
php
f
lock
()介绍f
lock
— 轻便的咨询文件锁定语法:bool f
lock
( resource $handle , int $operation [, int &$wouldb
lock
] )f
lock
() 允许执行一个简单的可以在任何平台中
使用
的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。在
PHP
5.3.2版本之前,锁也会被 fcl...
在秒杀,抢购等并发场景下,可能会出现超卖的现象,在
PHP
语言中并没有原生提供并发的解决方案,因此就需要借助其他方式来实现并发控制。列出常见的解决方案有:
使用
队列,额外起一个进程处理队列,并发请求都放到队列中,由额外进程串行处理,并发问题就不存在了,但是要额外进程支持以及处理延迟严重,本文不先不讨论这种方法。利用数据库事务特征,做原子更新,此方法需要依赖数据库的事务特性。借助文件排他锁,在处理下...
f
lock
— 轻便的咨询文件锁定说明f
lock
( resource $handle , int $operation [, int &$wouldb
lock
] ) : boolf
lock
() 允许执行一个简单的可以在任何平台中
使用
的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。在
PHP
5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会...
在看到项目代码中
使用
文件锁的形式防止并发,了解了下
LOCK
_
NB
选项的
使用
场景。 官网 http://www.
php
.net/manual/zh/function.f
lock
.
php
中有这么一句: 如果不希望 f
lock
() 在锁定时堵塞,则是
LOCK
_
NB
(Windows 上还不支持)。 ,想详细理解一下这句话的含义,这篇文章讲的挺好: ...