SplFileObject::flock

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::flock可移植文件锁定

说明

public SplFileObject::flock(int $operation, int &$wouldBlock = null): bool

以与 flock() 相同的可移植方式锁定或解锁文件。

参数

operation

operation 是以下之一

  • LOCK_SH 获取共享锁(读取器)。
  • LOCK_EX 获取独占锁(写入器)。
  • LOCK_UN 释放锁(共享或独占)。

还可以将 LOCK_NB 作为位掩码添加到上述操作之一,如果 flock() 在锁定尝试期间不应阻塞。

wouldBlock

如果锁将阻塞(EWOULDBLOCK errno 条件),则设置为 true

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 SplFileObject::flock() 示例

<?php
$file
= new SplFileObject("/tmp/lock.txt", "w");
if (
$file->flock(LOCK_EX)) { // 执行独占锁定
$file->ftruncate(0); // 截断文件
$file->fwrite("在此处写入内容\n");
$file->flock(LOCK_UN); // 释放锁定
} else {
echo
"无法获取锁定!";
}
?>

参见

  • flock() - 可移植的建议性文件锁定

添加注释

用户贡献的注释 2 个注释

4
digitalprecision at gmail dot com
13 年前
为了记录,此处给出的示例包含显式命令来截断文件,但是使用 'w' 的 '写入模式',它会自动为您执行此操作,因此不需要截断调用。
0
Ahmed Rain
2 年前
@digitalprecision 你说的话并不完全正确,如果在获取锁之前对文件进行了写入,则需要 ftruncate(0);。您可能还需要 fseek(0); 将文件指针移回文件开头

<?php
$file
= new SplFileObject("/tmp/lock.txt", "w");
$file->fwrite("xxxxx"); // 在获取锁之前写入内容
sleep(5); // 等待 5 秒

if ($file->flock(LOCK_EX)) { // 执行独占锁定
$file->fwrite("在此处写入内容\n");
$file->flock(LOCK_UN); // 释放锁定
} else {
echo
"无法获取锁定!";
}
?>

"lock.txt" 内容

xxxxx在此处写入内容
To Top