首先介紹下短鏈接和長(zhǎng)連接的區(qū)別:
短連接
連接->傳輸數(shù)據(jù)->關(guān)閉連接(推薦學(xué)習(xí):PHP編程從入門到精通)
比如HTTP是無(wú)狀態(tài)的的短鏈接,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。
具體就是 瀏覽器client發(fā)起并建立TCP連接 -> client發(fā)送HttpRequest報(bào)文 -> server接收到報(bào)文->server handle并發(fā)送HttpResponse報(bào)文給前端,發(fā)送完畢之后立即調(diào)用socket.close方法->client接收response報(bào)文->client最終會(huì)收到server端斷開TCP連接的信號(hào)->client 端斷開TCP連接,具體就是調(diào)用close方法。
也可以這樣說(shuō):短連接是指SOCKET連接后,發(fā)送接收完數(shù)據(jù)后馬上斷開連接。
因?yàn)檫B接后接收了數(shù)據(jù)就斷開了,所以每次數(shù)據(jù)接受處理不會(huì)有聯(lián)系。 這也是HTTP協(xié)議無(wú)狀態(tài)的原因之一。
長(zhǎng)連接
連接->傳輸數(shù)據(jù)->保持連接 -> 傳輸數(shù)據(jù)-> ………..->直到一方關(guān)閉連接,多是客戶端關(guān)閉連接。
長(zhǎng)連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
每次我們?cè)L問(wèn)PHP腳本的時(shí)候,都是當(dāng)所有的PHP腳本執(zhí)行完成后,我們才得到返回結(jié)果。如果我們需要一個(gè)腳本持續(xù)的運(yùn)行,那么我們就要通過(guò)php長(zhǎng)連接的方式,來(lái)達(dá)到運(yùn)行目的。
一般php環(huán)境為apache+php+linux,但是由于apache對(duì)php連接都有時(shí)間限制,一般超過(guò)這個(gè)連接時(shí)間apache服務(wù)器會(huì)自動(dòng)斷掉連接。
這種情況下比較簡(jiǎn)單方便的方式就是在php頁(yè)面中設(shè)置set_time_limit(0)(當(dāng)然也可以在php.ini配置文件中設(shè)置,但是這樣對(duì)整個(gè)環(huán)境產(chǎn)生影響,畢竟我們并不想對(duì)所有連接都可以長(zhǎng)時(shí)間連接,影響服務(wù)性能)
每個(gè)PHP腳本都限制了執(zhí)行時(shí)間,所以我們需要通過(guò) set_time_limit 來(lái)設(shè)置一個(gè)腳本的執(zhí)行時(shí)間為無(wú)限長(zhǎng),然后使用 flush() 和 ob_flush() 來(lái)清除服務(wù)器緩沖區(qū),隨時(shí)輸出腳本的返回值。
<?php header("Content-Type: text/plain"); set_time_limit(0); while( true ) { // 持續(xù)執(zhí)行的腳本 flush(); ob_flush(); sleep(5); } ?>
當(dāng)我們執(zhí)行后,每隔5秒鐘,我們會(huì)執(zhí)行一次,通過(guò)這一方法,我們可以完成很多功能,例如后臺(tái)監(jiān)控程序,定時(shí)執(zhí)行功能,日志分析,數(shù)據(jù)整理等耗時(shí)的操作。