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

PHP 進程鎖機制全解析:flock 文件鎖、Sync Mutex/RWLock、Semaphore 信號量與 pthreads 互斥鎖實戰

     編輯:PHP 相關知識

PHP 進程鎖機制全解析:flock 文件鎖、Sync Mutex/RWLock、Semaphore 信號量與 pthreads 互斥鎖實戰

解決併發衝突的核心手段是鎖。本文系統整理 PHP 可用的四大鎖機制:文件諮詢鎖、Sync 擴展互斥/讀寫/事件鎖、SysV 信號量、pthreads 互斥鎖,附完整代碼驗證行為差異。

1. flock 文件諮詢鎖

最通用、跨平台。flock($fp, LOCK_EX | LOCK_NB) 非阻塞排他鎖,配合 PID 文件防止重複啟動(如 php-fpm、crontab 任務)。

$fp = fopen('/tmp/process.pid', 'w+');
if (flock($fp, LOCK_EX | LOCK_NB)) {
    ftruncate($fp, 0); fwrite($fp, $pid); fflush($fp);
    sleep(300); // 長任務
    flock($fp, LOCK_UN);
} else { echo "進程已運行"; }

特性: 進程結束自動釋放,支援共享鎖 LOCK_SH 實現讀寫分離。

2. Sync 擴展

PECL 安裝 pecl install sync,提供跨進程同步原語。

  • SyncMutex: 互斥鎖,lock(ms) 超時毫秒,-1 無限等待。
  • SyncReaderWriter: 讀寫鎖,readlock/readunlock、writelock/writeunlock 成對使用。
  • SyncEvent: 事件通知,wait() 阻塞,fire() 喚醒單一進程(類 Go Cond)。
  • SyncSemaphore: 信號量,建構子指定 initialval 允許同時進入數。
$mutex = new SyncMutex('UniqueName');
$mutex->lock(200); // 200ms 超時
// critical section
$mutex->unlock();

3. SysV 信號量

原生 sem_get/acquire/release/remove,需 ftok 產生 key。

$key = ftok(__FILE__, 'c');
$sem = sem_get($key);
sem_acquire($sem); // 陣塞
// critical section
sem_release($sem);

注意: sem_acquire($sem, true) 非阻塞模式下失敗不自動釋放,release 必須在成功獲取後成對呼叫,否則觸發 Warning。

4. pthreads 互斥鎖

僅限 ZTS 環境。pthread_mutex_lock/trylock/unlock,trylock 忙碌即刻返回避免死鎖。

pthread_mutex_lock(&cnt.lock);
cnt.sum += i;
pthread_mutex_unlock(&cnt.lock);

鎖選型決策樹

  • 需跨機器分佈式鎖 → Redis Redlock / ZooKeeper / etcd
  • 單機多進程、簡單部署 → flock (文件) 或 SyncMutex
  • 讀多寫少、需高併發讀 → SyncReaderWriter
  • 固定並發度資源池 → SyncSemaphore / SysV Sem
  • CLI 多執行緒共享記憶體 → pthreads mutex

理解各鎖語義與適用邊界,是編寫健壯併發 PHP 程式的關鍵。

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