php 長連接--php


什麼是長連接,如果你沒聽說過,可以往下看!

   長連接到底有什麼用?我想你應該見過很多在線聊天工具吧,比如新浪的Woocall,另外還有很多網頁在線聊天的工具Omegle也是一個很不錯的網站,前段時間挺火的,目前alexa全球排名8694(2009-8-18數據),另外使用校內的人應該會熟悉其中一個功能,如果有人回覆你了,網站會馬上出現提示,此時你並沒有刷新頁面;Gmail也有此功能,如果郵箱裏收到了新的郵件,網站會馬上提醒你,即使你的網頁一直未刷新過。
  
   這麼多類似的功能都離不開長連接,短連接一般都是單項請求數據,服務器不能主動把數據“推”想客戶端,但有了長連接就好多了,利用後端與前端的技術組合起來,可以實現服務器的“推送信息”功能,如果數據庫裏面有更新,後端程序可以立即把數據“推送出來”,而不要多次反覆請求,多次建立連接,多次斷開。

php實現長連接示例:

 程序代碼<?php
echo "每隔3秒輸出一次<br />";
set_time_limit(0); //保證php程序運行不超時退出
while(1) {
   echo date("H:i:s")."<br />";
   ob_flush();
   flush(); //刷新並輸出PHP緩衝數據
   sleep(3); //延遲3秒
}
?>



示例代碼2:

 程序代碼

set_time_limit(0);
header("Connection:Keep-Alive");
header("Proxy-Connection:Keep-Alive");
for($i=0;$i<60;$i++) {
   print 'text'.$i.'<br>';
   ob_flush();
   flush();
   sleep(1);
   clearstatcache();
}

什麼是短連接、長連接、Socket基礎知識字體大小: socket

Socket協議的形象描述
  socket的英文原義是“孔”或“插座”。在這裏作爲4BDS UNIX的進程通信機制,取後一種意思。socket非常類似於電話插座。以一個國家級電話網爲例。電話的通話雙方相當於相互通信的2個進程,區號是它的網絡地址;區內一個單位的交換機相當於一臺主機,主機分配給每個用戶的局內號碼相當於socket號。任何用戶在通話之前,首先要佔有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)。對方假如在場並空閒(相當於通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。通話結束後,一方掛起電話機相當於關閉socket,撤消連接。

詳細內容見百科


通常短連接是這樣:連接->傳輸數據->關閉連接
那什麼是長連接?一般長連接相對短連接而言的,長連接在傳輸完數後不關閉連接,而不斷的發送包保持連接等待處理下一個數據包。
such as: 連接->傳輸數據->保持連接 -> 傳輸數據-> 。。。 ->關閉連接。

那什麼時候用短連接呢?
一般長連接用於少數client-end   to server-end的頻繁的通信,例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
而像WEB網站的http服務一般都用短鏈接,因爲長連接對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源。(查看來源)


TCP/IP通信解讀長短鏈接

一。通信方式
主要有以下三大類:
(一)SERVER/CLIENT方式
1.一個Client方連接一個Server方,或稱點對點(peer to peer):
2.多個Client方連接一個Server方,這也是通常的併發服務器方式。
3.一個Client方連接多個Server方,這種方式很少見,主要
用於一個客戶向多個服務器發送請求情況。

(二)連接方式
1.長連接
Client方與Server方先建立通訊連接,連接建立後不斷開,
然後再進行報文發送和接收。這種方式下由於通訊連接一直
存在,可以用下面命令查看連接是否建立:
netstat –f inet|grep 端口號(如5678)。
此種方式常用於點對點通訊。

2.短連接
Client方與Server每進行一次報文收發交易時才進行通訊連
接,交易完畢後立即斷開連接。此種方式常用於一點對多點
通訊,比如多個Client連接一個Server.

(三)發送接收方式
1.異步
報文發送和接收是分開的,相互獨立的,互不影響。這種方
式又分兩種情況:
(1)異步雙工:接收和發送在同一個程序中,有兩個不同的
子進程分別負責發送和接收
(2)異步單工:接收和發送是用兩個不同的程序來完成。
2.同步
報文發送和接收是同步進行,既報文發送後等待接收返回報文。
同步方式一般需要考慮超時問題,即報文發上去後不能無限等
待,需要設定超時時間,超過該時間發送方不再等待讀返回報
文,直接通知超時返回。

實際通信方式是這三類通信方式的組合。比如一般書上提供的
TCP/IP範例程序大都是同步短連接的SERVER/CLIENT程序。有的
組合是基本不用的,比較常用的有價值的組合是以下幾種:

同步短連接Server/Client
同步長連接Server/Client
異步短連接Server/Client
異步長連接雙工Server/Client
異步長連接單工Server/Client

其中異步長連接雙工是最爲複雜的一種通信方式,有時候經
常會出現在不同銀行或不同城市之間的兩套系統之間的通信。
比如金卡工程。由於這幾種通信方式比較固定,所以可以預
先編制這幾種通信方式的模板程序。

二.報文格式
通信報文格式多樣性更多,相應地就必須設計對應的讀寫報文的接
收和發送報文函數。

(一)阻塞與非阻塞方式 
1.非阻塞方式
讀函數不停地進行讀動作,如果沒有報文接收到,等待一段時間後
超時返回,這種情況一般需要指定超時時間。
2.阻塞方式
如果沒有報文接收到,則讀函數一直處於等待狀態,直到有報文到達。

(二)循環讀寫方式
1.一次直接讀寫報文
在一次接收或發送報文動作中一次性不加分別地全部讀取或全部
發送報文字節。
2.不指定長度循環讀寫
這一般發生在短連接進程中,受網絡路由等限制,一次較長的報
文可能在網絡傳輸過程中被分解成了好幾個包。一次讀取可能不
能全部讀完一次報文,這就需要循環讀報文,直到讀完爲止。

3.帶長度報文頭循環讀寫
這種情況一般是在長連接進程中,由於在長連接中沒有條件能夠
判斷循環讀寫什麼時候結束,所以必須要加長度報文頭。讀函數
先是讀取報文頭的長度,再根據這個長度去讀報文.實際情況中,
報頭的碼制格式還經常不一樣,如果是非ASCII碼的報文頭,還必須
轉換成ASCII,常見的報文頭碼制有:
(1)n個字節的ASCII碼
(2)n個字節的BCD碼
(3)n個字節的網絡整型碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章