PHP並沒有完善的線程支持,甚至部署到基於線程模型的httpd伺服器都會產生一些問題,但即使是多進程模型下的PHP,也難免出現多進程共同訪問同一資源的情況。例如整個程式共享的資料緩存,或是因為資源受限而必須對特定處理過程進行排隊,以及針對每個使用者產生唯一的某種識別的情形。 PHP語言本身並沒有提供進程互斥和鎖定機制,因而使得在這些情況下的程式設計遇到了困難,目前了解到的可選的辦法有以下內容:
利用MySQL的鎖定機制來實現互斥。缺點是增大了資料庫伺服器的連線負擔,並且使得程式依賴資料庫服務才能正常運作。
利用檔案鎖定機制。也就是利用flock函數透過檔案實現鎖定和互斥機制,來模擬通用程式設計模型下的鎖定原語的工作方式。這種方式在以前以純文字檔案為儲存引擎的時代成為保護資料完整性的必備元素,現在在使用文字檔案作為快取媒介的場合也相當常見。 PmWiki應該也是使用了這個機制來提醒多人同時編輯一個頁面的情形。不過檔案鎖定機制多少會呼叫到宿主作業系統上的檔案鎖定特性,因此在使用時一定要檢查伺服器作業系統是否為PHP環境提供了完善可靠的檔案鎖定機制。
利用共享記憶體空間計數。 PHP可以利用shmop_open函數開闢一塊記憶體空間,在服務進程之間共享數據,為了確保共享資料的互斥安全訪問,可以使用sem_get、sem_acquire和sem_release這組函數實現共享計數鎖定機制。這種辦法在後台實際上是呼叫了系統的ipc 服務來實現。
相關推薦:
#以上是PHP實現加鎖解鎖原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!