http://www.cnblogs.com/scotoma/archive/2010/09/26/1836312.html
Apache + PHP 的並發訪問
http://www.cnblogs.com/WestContinent/archive/2013/03/25/2981667.html
4.結論 從上面的試驗結果可以得到如下結論,因為兩組測試數據中的時間犬牙交錯,兩個用戶在耗時操作中並沒有出現某一個用戶長時間占用執行時間片的情況。說明Apache+Php(loadmodule)是
支持多用戶並行操作的。另外全局變量Count在兩個用戶同時訪問的時候都是以全新的狀態出現的,因此Apache+Php(loadmodule)不支持內存緩存數據,也就是說在多用戶並發訪問的情況
下每次訪問都會開辟新的內存(不同進程空間)。那么如果需要對多用戶的操作做同步,只能使用文件鎖的方式來實現了。
加鎖解鎖PHP實現
http://blog.csdn.net/topasstem8/article/details/6735240
PHP並沒有完善的線程支持,甚至部署到基於線程模型的httpd服務器都會產生一些問題,但即使是多進程模型下的PHP,也難免出現多進程共同訪問同一 資源的情況。比如整個程序共享的數據緩存,或者因為資源受限而必須對特定處理過程進行排隊,以及針對每個用戶生成唯一的某種標識的情形。PHP語言自身沒 有提供進程互斥和鎖定機制,因而使得在這些情況下的編程遇到了困難,目前了解到的可選的辦法有以下這些:
- 利用MySQL的鎖定機制來實現互斥。缺點是增大了數據庫服務器的連接負擔,並且使得程序依賴於數據庫服務才能正常工作。
- 利用文件鎖機制。也就是利用flock函數通過文件實現鎖定和互斥機制,來模擬通用編程模型下的鎖定原語的工作方式。這種方式在以前以純文本文件為存儲引擎的時代成為保護數據完整性的必備元素,現在在使用文本文件作為緩存媒介的場合也相當常見。PmWiki應該也是使用了這個機制來對多人同時編輯一個頁面的情形進行提醒。不過文件鎖機制多少會調用到宿主操作系統上的文件鎖特性,因此在使用時一定要檢查服務器操作系統是否為PHP環境提供了完善可靠的文件鎖機制。
- 利 用共享內存空間計數。PHP可以利用shmop_open函數開辟一塊內存空間,在服務進程之間共享數據,為了保證共享數據的互斥安全訪問,可以使用 sem_get、sem_acquire和sem_release這組函數實現共享計數鎖定機制。這種辦法在后台實際是調用了系統的ipc 服務來實現。
用 PHP 編寫支持高並發的網站,需要做什么處理?
http://www.zhihu.com/question/20049768
- Webserver (Nginx) :這一層是可以輕松分布式部署的,結合智能DNS解析可以簡易地防止單點故障、實現區域訪問加速,結合LVS很容易實現負載均衡。這一層主要是負責處理靜態請求和轉發PHP請求至第二層的PHP處理節點,至於靜態資源地址(http://misc.xxxx.com)可以單獨拿出來部署,或者直接使用商用的雲存儲服務(國內七牛不錯,國外有Amazon S3)
- PHP 處理節點:一個節點其實就是一個監聽特定端口的系統進程,webserver的請求通過負載均衡器(我用的AWS的loadbalancer)進行分發, 很好實現分布式和負載均衡。我現在用的還是php自帶的php-fpm,其實facebook出的hhvm性能非常強悍,但是還不能100%通過我項目的 單元測試,等hhvm成熟過后可以平滑替換
- 高速緩存:用的memcached,這一層的作用主要是減輕數據庫IO和加快熱數據 訪問,緩存策略與程序耦合度較高,不贅述,但簡單地說有兩種方式,一種是在程序的全局層面加一個緩存處理,這種方法代碼耦合度低,但是有效命中率不高,有 些項目不一定適應,另一種是在具體的數據存取處加緩存處理,這種辦法程序耦合度較高,但是緩存命中率非常高,幾乎沒有無效緩存存在,我用的是這種。
- 數 據庫 :我現在的項目數據規模不大,暫時只用了單台數據庫,但是程序邏輯上已做好了數據庫線性擴展的准備。其實數據庫層的擴展是老生常談了,常用手段是分庫分 表,這一塊需要在前期的代碼就打下基礎,另外更平滑地手段是使用中間件,比如360的Atlas,阿里巴巴的cobar,淘寶的TDDL,中間件可以在不 大范圍變更代碼的情況下擴展,但是具體的使用場景還是有限的,具體項目還需單獨考察。
- 其他:根據不同的項目,架構還可以選擇性地使用隊列,我現在用的beantalkd,Redis也是一個很好的選擇。隊列常用的使用環境是郵件發送和站內消息推送上面,但是在某些場景下也可以作為核心數據庫的緩沖,對應對大並發或者突發性流量也是不錯的選擇