1. 用php編寫支持高並發的網站,需要做什麼處理
PHP語言開發高並發的網站,需要加緩存,復雜邏輯走消息隊列非同步處理,mysql查詢必須走索引,還搞不定就加機器分流,mysql配置升高並且一主多從,使用codis集群,增加消息隊列的消費者,如果還搞不定就隨機拒絕請求,當然這是最後的退路。
緩存
緩存是避免業務查詢過多的請求mysql,導致業務不可用,段氏根據場景來判斷是否需要使用codis集群,如果並發量沒有達到某個級別,16G的redis也可以,但是要避免redis在高並發下容易發生的緩存穿透,盡量做成高可用,並保證緩存實現的命中率。
消息隊列
這也是高並發情境下的殺手鐧,削峰填谷,將耗時的業務邏輯直接以隊列的形式非同步慢慢處理,防止請求過度積壓,導致的伺服器不可用。
mysql優化
有些場景下必須查詢mysql的,也應該走索引,避免多表聯合查詢,甚至mysql的事務隔離級別都盡量的降低,或者直接去掉事務,採用最終一致性的補償指明機制。升級mysql的配置,核心數和內存的提升對查詢速度的優化是顯而易見的,最好能一步到位的走一主多從,查詢路由到從伺服器上。
隨機拒絕請求
這不是開玩笑,我們必須保證伺服器可用,寧願拒絕掉一些請求,也不能讓伺服器大量請求阻塞握逗散,最終導致大家都用不了。
2. 用PHP 編寫支持高並發的網站,需要做什麼處理
PHP支持高並發很多時候不是光靠PHP的。具體根據你的業務邏輯,下面列一些例子:
資料庫層面,表結構必須合理,盡量避免聯表查詢,能夠縮短處理時間
配置額外圖片伺服器或使用cdn,降低伺服器壓力
使用緩存處理類似搶購、投票等高並發請求,如redis。
消息隊列處理耗時較久的請求,如發郵件等
必要時使用多台伺服器,後台使用一台,前台可將高並發的業務與其他分開,避免因其中一個業務導致全部崩潰
3. PHP高並發下單用事務可以解決嗎
事物不是解決高並發的。事物是為了一個操作的完整性才使用的。
php的高並發在我看主要以來php腳本的執行速度,以及對資料庫的數據訪問的次數,還有緩存系統的使用(包括數據緩存以及模板緩存),系統架構的優化。
還有就是web伺服器做負載均衡,域名cdn做負載均衡等。
4. PHP 緗戠珯濡備綍瑙e喅緗戠珯澶ф祦閲忋侀珮騫跺彂鐨勯棶棰橈紵
memcache,欏甸潰闈欐佸寲錛屽瑰滻瀹氫笉鍙樼殑欏甸潰閲囩敤闈欐佸勭悊錛屽規暟鎹搴撻珮騫墮潪錛岄珮璁塊棶錛岄噰鍙杕emcache鎶鏈錛屽噺杞誨規暟鎹搴撶殑璁塊棶銆
5. php redis高並發rpush是數據一致性嗎
不會,這里的原子性不要從php的角度看,應該從redis的角度看,同一個redis節點對並發的請求都是序列化處理的,所以單操作不存在你擔心的並發問題,但如果是read & write的形式到哪裡都不行了,切記。
有人問到read & write是啥,其實就是並發的一個經典問題,代碼如下
$v = $redisClient->get('v');
$v ++;
$redisClient->set('v', $v);
就是先讀取數據,再修改數據,在寫回修改,這里是希望每次訪問都遞增v的值,但在並發情況下,兩個進程都讀取到了一樣的初始值,比如3,然後都加1變為4,最後把4寫回Redis,這種情況就會統計數據比實際的少。盡量都用Redis的原子操作就好,比如incr。