在哪些情況下我們會用到這麼進階的東西?尤其是關於流的。在哪些情況下會用流這種東西?建立長串連不是說PHP不允許嗎???那麼PHP出現這些東西,到底是用在哪些場合呢?
回複內容:
在哪些情況下我們會用到這麼進階的東西?尤其是關於流的。在哪些情況下會用流這種東西?建立長串連不是說PHP不允許嗎???那麼PHP出現這些東西,到底是用在哪些場合呢?
php不能使用長串連,主要原因是這門語言是不能常駐記憶體的(除非你在命令列下使用php),你請求一個php寫的網頁,然後重新整理一下,上次請求過程中產生的所有局部變數都被標記為回收了。想想,如果使用長串連,你肯定要複用之前建立串連的socket控制代碼吧,正是由於這種機製造成沒法儲存這個socket控制代碼了。
不知道你說的 stream 是指什嗎?二進位流的話用到的地方也挺多的吧,檔案傳輸基本上都是用的二進位傳輸的吧,另外我記得開放介面的傳輸也是使用的二進位的。這個問題我不是很清楚,就稍帶講一下不多表了。
HTTP 長串連是什嗎?
我覺得你肯定理解錯長串連是什麼東西了。說到長串連我們必須說一下短串連。HTTP串連 是一種無狀態串連,client 和 server 在三向交握建立串連之後,client 請求資料,server 返回資料後就會關閉串連,這種就是短串連。基於短串連的原理,我們在 client 使用 AJAX 不停的向伺服器請求是否有新資料(即 AJAX pull)的行為就是輪詢。這種方法優點在於簡單,缺點當然也很明顯,造成了相當多不必要的資源浪費以及伺服器的無上壓力。
為瞭解決這些問題,出現了基於短串連方法的修改版 - 長串連。長串連的方法也很簡單,client 和 server 在三向交握建立串連,client 請求資料,當 server 端發現沒有新資料的時候並不立即返回,而是hold住串連(即 Keep Alive),帶有新資料返回 / 連線逾時的時候則返回資料關閉串連。基於長串連的原理,當 client 收到資料返回(即串連斷開)之後我們立即發起一次新的串連重複以上過程的方法就是我們所說的 長輪詢 了。長串連比短串連的好處在於大大減少了 client 和 server 的請求次數。眾所周知,一次 HTTP串連 需要經曆三向交握這種複雜的過程,光速從美國經過海底光纖到達中國還需要 50ms 左右的時間呢,何況還要經曆三次!所以這種方法的好處是很明顯的,但是有好的一面也會有壞的一面。長串連由於需要伺服器 hold 住串連,當 client 請求多的時候必然會對伺服器造成 ++無上 的壓力,這個壓力並沒有解決。
根據問題我再說一下 server 端 hold 住串連這個事情。眾所周知,PHP當頁面指令碼執行完畢之後就會將內容返回給 CGI 然後交給 web server 返回給 client 端。所以 hold住串連這件事情也就非常簡單,寫一個死迴圈讓指令碼一直在運行即可 hold住串連了。PHP 對於這個的實現還是比較簡單的,我在這裡寫一個語義 demo 僅供參考:
0 ) { echo json_encode($data); break; } sleep(5); } while(true);?>
使用長串連的時候記得 client 端發起請求的時候最好設定一個連線逾時時間,當超過時間之後即取消連結,通過縮短逾時時間可以達到控制伺服器壓力的目的,當逾時時間過小的時候基本上就和輪詢沒有區別了。
SOCKET 是什麼鬼及最美麗的語言能做任何事!
長串連和 socket 是沒有什麼關係的,現在我們來說說 socket。 socket 在 OSI網路七層協議中是介於應用程式層和傳輸層之間的東西,可以做基於 TCP, UDP, RawIP 和鏈路層的 socket(轉自 網路篇詳解)。具體的關於 HTTP連結 和 socket 的區別的話可以看看我剛才的引文,裡面有較為詳細的描述。不過簡單來說就是 sockets 能類比以 TCP/UDP 等為基礎做的應用程式層的連結。
| OSI中的層 |
功能 |
TCP/IP協議族 |
| 應用程式層 |
檔案傳輸,電子郵件,檔案服務,虛擬終端 |
TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
| 展示層 |
資料格式化,代碼轉換,資料加密 |
沒有協議 |
| 會話層 |
解除或建立與別的接點的聯絡 |
沒有協議 |
| 傳輸層 |
提供端對端的介面 |
TCP,UDP |
| 網路層 |
為資料包選擇路由 |
IP,ICMP,RIP,OSPF,BGP,IGMP |
| 資料連結層 |
傳輸有地址的幀以及錯誤偵測功能 |
SLIP,CSLIP,PPP,ARP,RARP,MTU |
| 物理層 |
以位元據形式在物理媒體上傳輸資料 |
ISO2110,IEEE802。IEEE802.2 |
--- 轉載自 OSI網路七層協議和四層協議
那麼 PHP到底可不可以做 socket 呢?答案是 可以的!畢竟是 世界上最美麗的語言 嘛!基於圖靈完備的理論也的確是這樣子的。在 PHP 中有專門的 socket 實現擴充:Sockets。但是大家說 PHP不可以 也不是錯的。因為 PHP 的 socket 實現中由一個重要的步驟是使用 socket_listen() 函數實現連接埠的監聽,這個就必須需要 CLI 的支援了。總所周知 PHP一般的應用是使用 CGI 在網頁端實現,所以基於 CGI 上 PHP 的確是不可以的。但是 PHP 又不是沒有 CLI,哼哼~
在你想HTTP又沒有curl擴充的時候。