PHP並無完善的線程支持,甚至部署到基於線程模型的httpd服務器都會產生一些問題,但即便是多進程模型下的PHP,也不免出現多進程共同訪問同一資源的狀況。數據庫
好比整個程序共享的數據緩存,或者由於資源受限而必須對特定處理過程進行排隊,以及針對每一個用戶生成惟一的某種標識的情形。編程
PHP語言自身沒有提供進程互斥和鎖定機制,於是使得在這些狀況下的編程遇到了困難,目前瞭解到的可選的辦法有如下這些:緩存
1 利用MySQL的鎖定機制來實現互斥。缺點是增大了數據庫服務器的鏈接負擔,而且使得程序依賴於數據庫服務才能正常工做。
2 利用文件鎖機制。 也就是利用flock函數經過文件實現鎖定和互斥機制,來模擬通用編程模型下的鎖定原語的工做方式。這種方式在之前以純文本文件爲存儲引擎的時代成爲保護 數據完整性的必備元素,如今在使用文本文件做爲緩存媒介的場合也至關常見。PmWiki應該也是使用了這個機制來對多人同時編輯一個頁面的情形進行提醒。 不過文件鎖機制多少會調用到宿主操做系統上的文件鎖特性,所以在使用時必定要檢查服務器操做系統是否爲PHP環境提供了完善可靠的文件鎖機制。
3 利用共享內存空間計數。 PHP能夠利用shmop_open函數開闢一塊內存空間,在服務進程之間共享數據,爲了保證共享數據的互斥安全訪問,可使用sem_get、 sem_acquire和sem_release這組函數實現共享計數鎖定機制。這種辦法在後臺實際是調用了系統的ipc 服務來實現。安全