第一代的Web技術(shù)馆类,是基于HTML的靜態(tài)頁面男娄,用于發(fā)布靜態(tài)的內(nèi)容毅往。程序員們就想出來通過程序來生成HTML的技術(shù),將內(nèi)容保存于數(shù)據(jù)庫中芬为,然后通過SQl和模板引擎等技術(shù)去生成HTML頁面萄金。
第二代的Web,開始大量使用前端程序媚朦,使用Ajax等方式動態(tài)主動觸發(fā)事件氧敢,從服務(wù)端拉取數(shù)據(jù),并且增加了前端的程序邏輯询张。從而實現(xiàn)了Web頁面上的交互孙乖。
不過,隨著技術(shù)的發(fā)展份氧,前兩種架構(gòu)已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足信息交互需求了唯袄。通過采用Server PUSH的架構(gòu),服務(wù)器端可以主動向Web推送數(shù)據(jù)蜗帜,從而達(dá)到實時交互恋拷,這一定會是未來的主流。比如A厅缺,B蔬顾,C3人同時在一個頁面上瀏覽宴偿,A對B進(jìn)行了評論,并且提到了C诀豁。傳統(tǒng)的架構(gòu)窄刘,B,C將無法感知到舷胜,只有B都哭,C再次拉取內(nèi)容時,才會得到此信息逞带。顯然B ,C錯過了與A交互的最佳時機(jī)纱新,而且得知信息的時間延后了很多展氓。
傳統(tǒng)的PULL模式,也可以通過定時輪詢的方式來嘗試?yán)?shù)據(jù)脸爱。但這種技術(shù)1是并不是實時的遇汞,信息還是需要到了一定時間間隔才可以得到。2簿废,這種方式可能大部分請求是無效的空入,白白浪費了一次網(wǎng)絡(luò)請求。還造成了web Server的負(fù)載大大增高族檬。
真正的PUSH技術(shù)目前有3種歪赢,WebSocket,目前還不夠成熟单料,而且IE瀏覽器或其他低版本瀏覽器不支持埋凯。Flash Socket,雖然可以實現(xiàn)扫尖,但需要依賴Flash第三方組件白对,而且可能會被防火墻或者其他安全策略攔截,實際效果不理想换怖。XHR輪詢甩恼,這種方式目前是最成熟的解決方案,瀏覽器端開啟KeepAlive沉颂,Server使用epoll等異步IO方式条摸,效率非常高,實測效果非常好兆览。目前Facebook屈溉、人人網(wǎng)都使用此模式。
目前大部分PUSU架構(gòu)抬探,都是用Erlang子巾、Node.js等語言去實現(xiàn)帆赢。但Web2.0時代,基本上大部分網(wǎng)站都用PHP來實現(xiàn)的线梗。改用其他編程語言實現(xiàn)椰于,與現(xiàn)有架構(gòu)就會不兼容。PHP也有l(wèi)ibevent的Server實現(xiàn)方式仪搔,不過存在各種問題瘾婿,并不好用。
Swoole通過C寫了內(nèi)置Server烤咧,并作為PHP擴(kuò)展偏陪,提供了非常好的可編程性。Server本身的實現(xiàn)也非常高效煮嫌,采用了多線程Epoll笛谦,全異步驅(qū)動,讀寫分離的方式昌阿〖⒛裕可以很好的利用到多核。