首頁  >  文章  >  運維  >  php如何與apache連接逾時

php如何與apache連接逾時

步履不停
步履不停原創
2019-06-29 13:37:173633瀏覽

php如何與apache連接逾時

前言

#要理解瀏覽器與apache之間的連線逾時問題,需要先明白http的keep -alive屬性。先簡單介紹keep-alive,可以從網路上找到更詳細的介紹。

瀏覽器和apache都是基於http協定的。而http協定中的keep-alive屬性通俗的解釋就是瀏覽器和apache第一次建立TCP連接,傳輸完數據不會立刻斷開這個TCP連接,而是繼續等待下一個請求。維持一段時間(keep-alive-time)後才會斷開連線。

下面要做個測試,查看apache在開啟keep-alive支援和關閉keep-alive支援時候的TCP連線狀態。

服務端 虛擬機上的Centos
用戶端 本機上IE6瀏覽器
服務端位址 192.168.212.128
客戶端位址 192.168 .212.1
存取的檔案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>

首先關閉apache的keep-alive參數,開啟httpd.conf。

開啟瀏覽器存取apache。使用netstat指令查看連線狀態。

#netstat –nt|grep –i ’80′

可以看到四個連接,因為本地存取速度很快,只能抓取到TIME_WAIT得狀態。那一個test.html網頁為什麼會有四個連線呢?

看test.html的內容可以知道有:

1,main.css 檔案

2,mian.js   檔案

3,main. jpg 圖片

4,本身的test.html檔

所以有四個連接。

再看看關閉apache的keep-alive支援後的連線狀態。

重啟伺服器,瀏覽器存取test.html,在查看連線。

#service httpd restart

#netstat –nt|grep –i ’80′

可以看到只有一個連接。而且這個連線狀態是ESTABLISHED。我們在httpd.conf中設定了keepAlliveTimeout=15,所以連線建立後15秒後才關閉連線。

測試得到的結論

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

上圖中最下面的11個請求就是該網頁中需要引用的檔案數。

如果開啟apache的keep-alive屬性,訪問的頁面中的(上例中的test.html)所有文件,包括js,css,圖片等等只建立一個TCP連接,按照順序傳輸所有數據。所有資料傳輸完等待KeepAliveTimeout =15秒後再關閉該連線。

網路上看到的參考:

假如當前Apache每秒回應100個用戶訪問,KeepAliveTimeOut=5,此時httpd進程數就是100* 5=500個(prefork模式),一個httpd進程消耗5M記憶體的話,就是500*5M=2500M=2.5G,誇張吧?當然,Apache與Client只進行了100次TCP 連線。如果你的記憶體夠大,系統負載不會太高,如果你的記憶體小於2.5G,就會用到Swap,頻繁的Swap切換會加重CPU的Load。

現在我們關掉KeepAlive,Apache仍然每秒響應100個用戶訪問,因為我們將圖片、js、css等分離出去了,每次訪問只有1個request,此時httpd的進程數是100*1=100個,使用記憶體100*5M=500M,此時Apache與Client也是進行了100次TCP連線。性能卻提升了太多。

瀏覽器的連線逾時

每個瀏覽器都有預設的連線逾時時間。 IE6的預設時間為60分鐘。

這個值可以透過註冊表修改。

1,開啟登錄:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。

2,增加一個DWORD值的項,命名為ReceiveTimeout,設定1000。該值的預設單位是毫秒,這裡設定的1秒時間。

從瀏覽器開始造訪網站開始,1秒後關閉連線。 (設的值有點極端,但是方便展示)。

重啟瀏覽器訪問網站。

服務端 虛擬機上的Centos
用戶端 本機上IE6瀏覽器
服務端位址 192.168.212.128
客戶端位址 192.168 .212.1
所存取的檔案index.php #
<?php  
echo date(&#39;H:i:s&#39;,time());  
sleep(10);  
?>

可以看到浏览器显示找不到服务器,但是访问刚才的test.html是可以访问的。

访问index.php显示连接不成功。因为index.php中sleep(10)延迟10秒的函数。而IE6的连接超时时间为1秒。所以就连接失败了。

访问test.hml可以成功连接。因为是访问本地服务器,传输速度很快,在IE6的1秒超时时间之内就已经传完全部数据了。

测试得到的结论

IE6的默认连接超时时间为60分。可以通过注册表中ReceiveTimeout值修改该值。

实际作用:使用IE6往服务器上传一个大文件,如果上传时间超过60分钟就会断开连接。

这也是为什么有些网站要专门开发active插件来实现IE6的大文件上传了。用户是不会主动修改这个值的。

apache的连接超时

看apache的配置文件可以看到有个timeout值。

有人会以为这个是apache的连接超时参数。

我们把它设置为timeout =1访问index.php。

看到还是可以访问的,那么这个timeout不是apache的连接超时时间。timeout是apache收到上一个请求和后面一个请求到来之间的最大值。您可以查看浏览器与apache通讯中的TCP连接状态迁移更加准确的明白timeout的值。

那么apache的连接超时时间到底是多少?是什么参数控制呢?

答:apache没有最大连接超时时间,也没有控制连接超时的参数。因为apache是在TCP/IP模型的应用层。

那么服务端是什么控制了浏览器和apache之间的最大连接超时时间呢?

答:linux

测试得到的结论

apache没有最大连接超时时间,也没有控制连接超时的参数。因为apache是在TCP/IP模型的应用层。

linux的连接超时

在linux的系统配置中可以到关于连接时间的有这两个参数。

#sysctl -a|grep time

一个是限制FIN_WAIT状态的超时时间,

一个是限制keepalive连接的超时时间。

结论

linux的默认配置下也没控制浏览器和apache连接超时的参数,只有通过linux的防火墙才能控制apache和浏览器之间连接的最大连接时间。

PHP的操作超时

打开php.ini可以看到两个参数。

max_execution_time:一个php程序执行的最长时间。

max_input_time:一个表单提交的最长时间。

这两个值很重要。我们做个测试:

服务端 虚拟机上的Centos
客户端 本机上IE6浏览器
服务端地址 192.168.212.128
客户端地址 192.168.212.1
访问的文件index.php
<?php  
for($i = 0;;$i++){  
 echo date('H:i:s',time());  
 echo '<br/>';  
 flush();  
}  
?>
max_execution_time 30

访问index.php。

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


30秒后IE死掉了。为什么呢?答:index.php中有死循环。执行到max_execution_time=30秒后php停止了操作。浏览器这边死掉了。

总结

如果从头到尾看完上面的内容,会得出如下结论:

1,在客户端,浏览器控制着浏览器和apache的最大连接超时时间。

2,在服务端(不打开防火墙),linux和apache都不能控制最大连接超时时间,只有php或者mysql等运行程序通过控制自身的执行时间来控制浏览器和apache的最大连接超时时间。

3,在服务端(打开防火墙),linux上的防火墙和php,mysql等共同控制浏览器和apache的最大连接超时时间。

4,这里的浏览器和apache的最大连接超时时间包括TCP连接中的所有状态超时时间的综合。

更多Apache的相关技术文章,请访问Apache教程栏目进行学习!

以上是php如何與apache連接逾時的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn