PHP Conference Japan 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 釋放鎖定 (共用或獨佔)。

也可以將 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("Write something here\n");
$file->flock(LOCK_UN); // 釋放鎖定
} else {
echo
"無法取得鎖定!";
}
?>

參見

  • flock() - 可攜式諮詢檔案鎖定

新增註釋

使用者貢獻的註釋 2 則註釋

digitalprecision at gmail dot com
13 年前
備註:此處提供的範例具有明確清空檔案的指令,但是使用「w」的「寫入模式」會自動執行此操作,因此不需要呼叫 truncate。
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("Write something here\n");
$file->flock(LOCK_UN); // 釋放鎖定
} else {
echo
"無法取得鎖定!";
}
?>

"lock.txt" 檔案內容

xxxxxWrite something here
To Top