> 운영 및 유지보수 > Apache > 시간 초과로 PHP가 Apache에 연결하는 방법

시간 초과로 PHP가 Apache에 연결하는 방법

步履不停
풀어 주다: 2019-08-02 18:08:51
원래의
3678명이 탐색했습니다.

시간 초과로 PHP가 Apache에 연결하는 방법

머리말

브라우저와 아파치 사이의 연결 시간 초과 문제를 이해하려면 먼저 http의 연결 유지 속성을 이해해야 합니다. 먼저 keep-alive에 대해 간단히 소개하겠습니다. 자세한 소개는 온라인에서 확인하실 수 있습니다.

브라우저와 아파치 모두 http 프로토콜을 기반으로 합니다. http 프로토콜의 연결 유지 속성에 대한 일반적인 설명은 브라우저와 아파치가 처음으로 TCP 연결을 설정한다는 것입니다. 데이터가 전송된 후 TCP 연결이 즉시 끊어지지 않고 계속해서 연결이 끊어질 때까지 기다립니다. 다음 요청. 일정 시간(keep-alive-time)이 지나면 연결이 끊어집니다.

Keep-Alive 지원을 켜고 끌 때 Apache의 TCP 연결 상태를 확인하는 테스트를 해보자.

Server 가상 머신의 Centos
Client 이 머신의 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를 엽니다.

아파치에 액세스하려면 브라우저를 엽니다. netstat 명령을 사용하여 연결 상태를 확인하십시오.

#netstat –nt|grep –i ’80′

4개의 연결을 볼 수 있는데, 로컬 접속 속도가 매우 빠르기 때문에 TIME_WAIT 상태만 캡쳐할 수 있습니다. test.html 웹 페이지에 4개의 링크가 있는 이유는 무엇입니까?

test.html의 내용을 보면

1, main.css 파일

2, main.js 파일

3, main.jpg 그림

4이 있다는 것을 알 수 있습니다. 자체 테스트입니다. html 파일

그래서 4개의 연결이 있습니다.

아파치의 연결 유지 지원을 끈 후 연결 상태를 살펴보겠습니다.

서버를 다시 시작하고 브라우저로 test.html에 접속하여 연결을 확인하세요.

#service httpd restart

#netstat –nt|grep –i ’80′

연결이 하나만 있는 것을 볼 수 있습니다. 그리고 연결 상태는 ESTABLISHED입니다. httpd.conf에 keepAlliveTimeout=15를 설정하여 연결이 설정된 후 15초 후에 연결이 닫힙니다.

테스트 결론

아파치의 연결 유지 속성을 끄면 js, css, 그림 등을 포함하여 액세스한 페이지(위 예에서는 test.html)의 모든 파일에 연결 유지 속성을 설정해야 합니다. 새로운 TCP 연결. 참조된 파일 수만큼 연결이 존재합니다. 특정 수의 파일은 Firefox의 BUG 도구를 사용하여 볼 수 있습니다.

위 사진의 하단 11개 요청은 웹페이지에서 참조해야 하는 파일 개수입니다.

아파치의 연결 유지 속성을 활성화하면 js, css, 이미지 등을 포함하여 액세스한 페이지(위 예에서는 test.html)의 모든 파일이 TCP 연결만 설정하고 모든 데이터를 순서. 연결을 닫기 전에 모든 데이터가 전송된 후 KeepAliveTimeout =15초 동안 기다리십시오.

인터넷에서 본 참고 자료:

현재 Apache가 초당 100명의 사용자 방문에 응답하는 경우 KeepAliveTimeOut=5이면 httpd 프로세스 수는 100*5=500(프리포크 모드)이고 하나의 httpd 프로세스입니다. 5M 소모 메모리는 500*5M=2500M=2.5G 인데 과장인가요? 물론 Apache와 클라이언트는 100개의 TCP 연결만 만들었습니다. 메모리가 충분히 크면 시스템 로드가 너무 높지 않습니다. 메모리가 2.5G 미만인 경우 스왑을 자주 사용하면 CPU 로드가 증가합니다.

이제 KeepAlive를 끄고 Apache는 여전히 초당 100명의 사용자 방문에 응답합니다. 이미지, js, css 등이 분리되어 있고 각 방문에 대해 요청이 1번만 있고 이에 대한 httpd 프로세스 수가 있기 때문입니다. 시간은 100* 1=100, 메모리 100*5M=500M을 사용합니다. 이때 Apache와 클라이언트도 100개의 TCP 연결을 만들었습니다. 성능이 많이 좋아졌습니다.

브라우저 연결 시간 초과

각 브라우저에는 기본 연결 시간 초과가 있습니다. IE6의 기본 시간은 60분입니다.

이 값은 레지스트리를 통해 수정할 수 있습니다.

1. 레지스트리를 엽니다: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet 설정.

2. DWORD 값이 있는 항목을 추가하고 이름을 ReceiverTimeout으로 설정한 다음 1000으로 설정합니다. 이 값의 기본 단위는 밀리초이며, 여기서 설정하는 시간은 1초입니다.

브라우저가 웹사이트에 접속하기 시작하면 시작되고, 1초 후에 연결이 종료됩니다. (설정값은 다소 극단적이지만 표시하기에는 편리합니다.)

웹사이트에 액세스하려면 브라우저를 다시 시작하세요.

Server 가상 머신의 Centos
Client 이 머신의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿