flock
flock
(PHP 4, PHP 5, PHP 7)
群 - 便携式咨询文件锁定
描述
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
flock()
允许你执行一个简单的读写器模型,几乎可以在任何平台上使用(包括大多数Unix衍生产品,甚至Windows)。
On versions of PHP before 5.3.2, the lock is released also by fclose() (which is also called automatically when script finished).
PHP支持一种可通过建议方式锁定完整文件的可移植方式(这意味着所有访问的程序都必须使用相同的锁定方式,否则它将无法工作)。默认情况下,该函数将被阻塞,直到获取请求的锁; 这可以通过LOCK_NB
下面所述的选项来控制。
参数
handle
通常使用fopen()创建的文件系统指针资源。
operation
operation
是以下之一:
LOCK_SH
获取共享锁(阅读器)。
LOCK_EX
获得排他锁(作家)。
LOCK_UN
释放一个锁(共享或排他)。
LOCK_NB
如果您不希望flock()
在锁定时阻止,也可以将其作为位掩码添加到上述操作之一。
wouldblock
如果锁会阻塞(EWOULDBLOCK错误条件),则可选的第三个参数设置为1。
返回值
TRUE
成功或FALSE
失败时返回。
更新日志
版 | 描述 |
---|---|
5.5.22, 5.6.6 | 增加了对Windows上的willblock参数的支持。 |
5.3.2 | 文件的资源句柄关闭时的自动解锁被删除。现在解锁总是必须手动完成。 |
例子
Example #1 flock() example
<?php
$fp = fopen("/tmp/lock.txt", "r+"
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0 // truncate file
fwrite($fp, "Write something here\n"
fflush($fp // flush output before releasing the lock
flock($fp, LOCK_UN // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp
?>
Example #2 flock() using the
LOCK_NB
option
<?php
$fp = fopen('/tmp/lock.txt', 'r+'
/* Activate the LOCK_NB option on an LOCK_EX operation */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Unable to obtain lock';
exit(-1
}
/* ... */
fclose($fp
?>
注意
注意
:flock()
在Windows上使用强制锁定而不是建议锁定。通过fcntl()系统调用支持的通常机制,Linux和System V操作系统也支持强制锁定:也就是说,如果有问题的文件已设置了setgid权限位并清除了组执行位。在Linux上,文件系统也需要使用mand选项进行挂载才能工作。
注意
:因为flock()
需要一个文件指针,所以可能必须使用一个特殊的锁文件来保护对打算截断的文件的访问,方法是在写模式下打开它(对fopen使用“w”或“w +”参数())。
注意
:只能用于本地文件的fopen()返回的文件指针或指向实现streamWrapper :: stream_lock()方法的用户空间流的文件指针。
警告
handle
在后面的代码中为参数分配另一个值将释放该锁。
警告
在某些操作系统上,flock()
是在进程级别实现的。当使用多线程服务器API(如ISAPI)时,您可能无法依赖flock()
来保护文件免受在同一服务器实例的并行线程中运行的其他PHP脚本的影响!
flock()
在FAT
及其派生类等陈旧的文件系统上不受支持,因此将始终FALSE
在此环境下返回。
← filetype
fnmatch →