多進程/線程環境下,文件寫入必須加鎖防止數據損壞。PHP flock() 提供諮詢式鎖機制。
<?php
function file_write($file_name, $text, $mode = 'a', $timeout = 30) {
$handle = fopen($file_name, $mode);
if (!$handle) return false;
// 等待獲取獨佔鎖
while ($timeout > 0) {
if (flock($handle, LOCK_EX)) { // 獨佔鎖(寫入)
break;
}
$timeout--;
sleep(1);
}
if ($timeout > 0) {
fwrite($handle, $text . "\n");
flock($handle, LOCK_UN); // 釋放鎖
fclose($handle);
return true;
}
fclose($handle);
return false; // 超時失敗
}
| 常量 | 值(舊版) | 用途 |
|---|---|---|
LOCK_SH | 1 | 共享鎖(讀取),多進程可同時持有 |
LOCK_EX | 2 | 獨佔鎖(寫入),同一時間僅一進程持有 |
LOCK_UN | 3 | 釋放鎖(共享/獨佔通用) |
LOCK_NB | 4 | 非阻塞模式(配合其他標誌使用) |
fopen() 返回的資源必須傳給 flock()fclose()、腳本結束、進程終止會自動釋放鎖link() 原子操作替代高併發場景建議:改用 Redis/Memcached 分佈式鎖或數據庫行鎖,文件鎖適用於單機低併發日誌寫入等場景。