首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 文件鎖機制實現併發安全寫入:flock() 完整實戰

     編輯:PHP 相關知識

基於 flock() 的文件獨佔鎖寫入模式

多進程/線程環境下,文件寫入必須加鎖防止數據損壞。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;  // 超時失敗
}

flock() 操作常量

常量值(舊版)用途
LOCK_SH1共享鎖(讀取),多進程可同時持有
LOCK_EX2獨佔鎖(寫入),同一時間僅一進程持有
LOCK_UN3釋放鎖(共享/獨佔通用)
LOCK_NB4非阻塞模式(配合其他標誌使用)

關鍵注意事項

  1. 諮詢式鎖:依賴所有進程協作遵守,無法強制阻止未調用 flock 的進程讀寫
  2. 句柄有效性:fopen() 返回的資源必須傳給 flock()
  3. 自動釋放:fclose()、腳本結束、進程終止會自動釋放鎖
  4. NFS 限制:網絡文件系統下 flock 可能不可靠,需用 link() 原子操作替代
  5. Windows 支援:PHP 5.3.2+ 完整支援,舊版本有限制

高併發場景建議:改用 Redis/Memcached 分佈式鎖或數據庫行鎖,文件鎖適用於單機低併發日誌寫入等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved