溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php與apache連接超時(shí)的方法

發(fā)布時(shí)間:2020-08-21 11:07:15 來(lái)源:億速云 閱讀:505 作者:小新 欄目:建站服務(wù)器

這篇文章將為大家詳細(xì)講解有關(guān)php與apache連接超時(shí)的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

前言

要理解瀏覽器和apache之間的連接超時(shí)問(wèn)題,需要先明白http的keep-alive屬性。先簡(jiǎn)單介紹keep-alive,您可以從網(wǎng)上查找更加詳細(xì)的介紹。

瀏覽器和apache都是基于http協(xié)議的。而http協(xié)議中的keep-alive屬性通俗的解釋就是瀏覽器和apache第一次建立TCP連接,傳輸完數(shù)據(jù)不會(huì)立刻斷開(kāi)這個(gè)TCP連接,而是繼續(xù)等待下一個(gè)請(qǐng)求。保持一段時(shí)間(keep-alive-time)后才會(huì)斷開(kāi)連接。

下面做個(gè)測(cè)試,查看apache在打開(kāi)keep-alive支持和關(guān)閉keep-alive支持時(shí)候的TCP連接狀態(tài)。

服務(wù)端虛擬機(jī)上的Centos
客戶端本機(jī)上IE6瀏覽器
服務(wù)端地址192.168.212.128
客戶端地址192.168.212.1
訪問(wèn)的文件test.html
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<link rel="stylesheet" type="text/css" href="./main.css" />  
<script type="text/javascript" src="./main.js"></script>  
</head>  
<body>  
您知道嗎?A處和B處的色值是一樣的。<br/>  
<img src="./main.jpg">  
</body>  
</html>

首先關(guān)閉apache的keep-alive參數(shù),打開(kāi)httpd.conf。

打開(kāi)瀏覽器訪問(wèn)apache。使用netstat命令查看連接狀態(tài)。

#netstat –nt|grep –i ’80′

可以看到四個(gè)連接,因?yàn)楸镜卦L問(wèn)速度很快,只能抓取到TIME_WAIT得狀態(tài)。那一個(gè)test.html網(wǎng)頁(yè)為什么會(huì)有四個(gè)連接呢?

看test.html的內(nèi)容可以知道有:

1,main.css 文件

2,mian.js   文件

3,main.jpg 圖片

4,本身的test.html文件

所以有四個(gè)連接。

再看看關(guān)閉apache的keep-alive支持后的連接狀態(tài)。

重啟服務(wù)器,瀏覽器訪問(wèn)test.html,在查看連接。

#service httpd restart

#netstat –nt|grep –i ’80′

可以看到只有一個(gè)連接。而且這個(gè)連接狀態(tài)是ESTABLISHED。我們?cè)趆ttpd.conf中設(shè)置了keepAlliveTimeout=15,所以連接建立后15秒后才關(guān)閉連接。

測(cè)試得到的結(jié)論

如果關(guān)閉apache的keep-alive屬性,訪問(wèn)的頁(yè)面中的(上例中test.html)所有文件,包括js,css,圖片等等都要建立新的TCP連接。有多少引用文件就建立多少個(gè)連接。具體多少個(gè)文件可以使用火狐的BUG工具查看。

上圖中最下面的11個(gè)請(qǐng)求就是該網(wǎng)頁(yè)中需要引用的文件數(shù)。

如果開(kāi)啟apache的keep-alive屬性,訪問(wèn)的頁(yè)面中的(上例中的test.html)所有文件,包括js,css,圖片等等只建立一個(gè)TCP連接,按照順序傳輸所有數(shù)據(jù)。所有數(shù)據(jù)傳輸完等待KeepAliveTimeout =15秒后再關(guān)閉該連接。

網(wǎng)上看到的參考:

假如當(dāng)前Apache每秒響應(yīng)100個(gè)用戶訪問(wèn),KeepAliveTimeOut=5,此時(shí)httpd進(jìn)程數(shù)就是100*5=500個(gè)(prefork模式),一個(gè)httpd進(jìn)程消耗5M內(nèi)存的話,就是500*5M=2500M=2.5G,夸張吧?當(dāng)然,Apache與Client只進(jìn)行了100次TCP 連接。如果你的內(nèi)存夠大,系統(tǒng)負(fù)載不會(huì)太高,如果你的內(nèi)存小于2.5G,就會(huì)用到Swap,頻繁的Swap切換會(huì)加重CPU的Load。

現(xiàn)在我們關(guān)掉KeepAlive,Apache仍然每秒響應(yīng)100個(gè)用戶訪問(wèn),因?yàn)槲覀儗D片、js、css等分離出去了,每次訪問(wèn)只有1個(gè) request,此時(shí)httpd的進(jìn)程數(shù)是100*1=100個(gè),使用內(nèi)存100*5M=500M,此時(shí)Apache與Client也是進(jìn)行了100次 TCP連接。性能卻提升了太多。

瀏覽器的連接超時(shí)

每個(gè)瀏覽器都有默認(rèn)的連接超時(shí)時(shí)間。IE6的默認(rèn)時(shí)間為60分鐘。

這個(gè)值可以通過(guò)注冊(cè)表修改。

1,打開(kāi)注冊(cè)表:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。

2,增加一個(gè)DWORD值的項(xiàng),命名為ReceiveTimeout,設(shè)置1000。該值的默認(rèn)單位是毫秒,這里設(shè)置的1秒時(shí)間。

從瀏覽器開(kāi)始訪問(wèn)網(wǎng)站開(kāi)始,1秒后關(guān)閉連接。(設(shè)的值有點(diǎn)極端,但是方便展示)。

重啟瀏覽器訪問(wèn)網(wǎng)站。

服務(wù)端虛擬機(jī)上的Centos
客戶端本機(jī)上IE6瀏覽器
服務(wù)端地址192.168.212.128
客戶端地址192.168.212.1
訪問(wèn)的文件index.php
<?php  
echo date('H:i:s',time());  
sleep(10);  
?>

可以看到瀏覽器顯示找不到服務(wù)器,但是訪問(wèn)剛才的test.html是可以訪問(wèn)的。

訪問(wèn)index.php顯示連接不成功。因?yàn)閕ndex.php中sleep(10)延遲10秒的函數(shù)。而IE6的連接超時(shí)時(shí)間為1秒。所以就連接失敗了。

訪問(wèn)test.hml可以成功連接。因?yàn)槭窃L問(wèn)本地服務(wù)器,傳輸速度很快,在IE6的1秒超時(shí)時(shí)間之內(nèi)就已經(jīng)傳完全部數(shù)據(jù)了。

測(cè)試得到的結(jié)論

IE6的默認(rèn)連接超時(shí)時(shí)間為60分??梢酝ㄟ^(guò)注冊(cè)表中ReceiveTimeout值修改該值。

實(shí)際作用:使用IE6往服務(wù)器上傳一個(gè)大文件,如果上傳時(shí)間超過(guò)60分鐘就會(huì)斷開(kāi)連接。

這也是為什么有些網(wǎng)站要專(zhuān)門(mén)開(kāi)發(fā)active插件來(lái)實(shí)現(xiàn)IE6的大文件上傳了。用戶是不會(huì)主動(dòng)修改這個(gè)值的。

apache的連接超時(shí)

看apache的配置文件可以看到有個(gè)timeout值。

有人會(huì)以為這個(gè)是apache的連接超時(shí)參數(shù)。

我們把它設(shè)置為timeout =1訪問(wèn)index.php。

看到還是可以訪問(wèn)的,那么這個(gè)timeout不是apache的連接超時(shí)時(shí)間。timeout是apache收到上一個(gè)請(qǐng)求和后面一個(gè)請(qǐng)求到來(lái)之間的最大值。您可以查看瀏覽器與apache通訊中的TCP連接狀態(tài)遷移更加準(zhǔn)確的明白timeout的值。

那么apache的連接超時(shí)時(shí)間到底是多少?是什么參數(shù)控制呢?

答:apache沒(méi)有最大連接超時(shí)時(shí)間,也沒(méi)有控制連接超時(shí)的參數(shù)。因?yàn)閍pache是在TCP/IP模型的應(yīng)用層。

那么服務(wù)端是什么控制了瀏覽器和apache之間的最大連接超時(shí)時(shí)間呢?

答:linux

測(cè)試得到的結(jié)論

apache沒(méi)有最大連接超時(shí)時(shí)間,也沒(méi)有控制連接超時(shí)的參數(shù)。因?yàn)閍pache是在TCP/IP模型的應(yīng)用層。

linux的連接超時(shí)

在linux的系統(tǒng)配置中可以到關(guān)于連接時(shí)間的有這兩個(gè)參數(shù)。

#sysctl -a|grep time

一個(gè)是限制FIN_WAIT狀態(tài)的超時(shí)時(shí)間,

一個(gè)是限制keepalive連接的超時(shí)時(shí)間。

結(jié)論

linux的默認(rèn)配置下也沒(méi)控制瀏覽器和apache連接超時(shí)的參數(shù),只有通過(guò)linux的防火墻才能控制apache和瀏覽器之間連接的最大連接時(shí)間。

PHP的操作超時(shí)

打開(kāi)php.ini可以看到兩個(gè)參數(shù)。

max_execution_time:一個(gè)php程序執(zhí)行的最長(zhǎng)時(shí)間。

max_input_time:一個(gè)表單提交的最長(zhǎng)時(shí)間。

這兩個(gè)值很重要。我們做個(gè)測(cè)試:

服務(wù)端虛擬機(jī)上的Centos
客戶端本機(jī)上IE6瀏覽器
服務(wù)端地址192.168.212.128
客戶端地址192.168.212.1
訪問(wèn)的文件index.php
<?php  
for($i = 0;;$i++){  
 echo date('H:i:s',time());  
 echo '<br/>';  
 flush();  
}  
?>
max_execution_time30

訪問(wèn)index.php。

<?php  
for($i = 0;;$i++){  
 echo date('H:i:s',time());  
 echo '<br/>';  
 flush();  
}  
?>


30秒后IE死掉了。為什么呢?答:index.php中有死循環(huán)。執(zhí)行到max_execution_time=30秒后php停止了操作。瀏覽器這邊死掉了。

總結(jié)

如果從頭到尾看完上面的內(nèi)容,會(huì)得出如下結(jié)論:

1,在客戶端,瀏覽器控制著瀏覽器和apache的最大連接超時(shí)時(shí)間。

2,在服務(wù)端(不打開(kāi)防火墻),linux和apache都不能控制最大連接超時(shí)時(shí)間,只有php或者mysql等運(yùn)行程序通過(guò)控制自身的執(zhí)行時(shí)間來(lái)控制瀏覽器和apache的最大連接超時(shí)時(shí)間。

3,在服務(wù)端(打開(kāi)防火墻),linux上的防火墻和php,mysql等共同控制瀏覽器和apache的最大連接超時(shí)時(shí)間。

4,這里的瀏覽器和apache的最大連接超時(shí)時(shí)間包括TCP連接中的所有狀態(tài)超時(shí)時(shí)間的綜合。

關(guān)于php與apache連接超時(shí)的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI