PHP 大会日本 2024

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 释放锁(共享或独占)。

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

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 条注释

digitalprecision at gmail dot com
13 年前
记录在案,此处给出的示例包含一个显式截断文件的命令,但是使用“w”的“写入模式”,它会自动为您执行此操作,因此不需要截断调用。
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