ホームページ  >  記事  >  運用・保守  >  PHPがタイムアウトでApacheに接続する方法

PHPがタイムアウトでApacheに接続する方法

步履不停
步履不停オリジナル
2019-06-29 13:37:173598ブラウズ

PHPがタイムアウトでApacheに接続する方法

まえがき

ブラウザと Apache の間の接続タイムアウトの問題を理解するには、まず keep を理解する必要があります。 http -alive 属性の。まずはキープアライブについて簡単に紹介しましょう。より詳細な説明はオンラインで見つけることができます。

ブラウザと Apache はどちらも http プロトコルに基づいています。 http プロトコルのキープアライブ属性の一般的な説明は、ブラウザと Apache が初めて TCP 接続を確立し、データが送信された後、TCP 接続はすぐには切断されず、接続が完了するまで待機し続けるというものです。次のリクエスト。一定時間 (キープアライブ時間) が経過すると、接続は切断されます。

Apache がキープアライブ サポートをオンにしたときとオフにしたときの、Apache の TCP 接続ステータスを確認するテストを行ってみましょう。

##サーバー アドレス##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'
サーバー 仮想マシン上の Centos
クライアント このマシン IE6 上ブラウザ
クライアント アドレス

4 つの接続が表示されますが、ローカルのアクセス速度が非常に速いため、TIME_WAIT ステータスのみが取得されます。 test.html Web ページにリンクが 4 つあるのはなぜですか?

test.html の内容を見ると、

1、main.css ファイル

2、main.js ファイル

# があることがわかります。 ##3、main.jpg 絵

4、独自の test.html ファイル

したがって、4 つのリンクがあります。

Apache のキープアライブ サポートをオフにした後の接続ステータスを見てみましょう。

サーバーを再起動し、ブラウザでtest.htmlにアクセスし、接続を確認してください。

#service httpd restart

#netstat –nt|grep –i '80'

接続が 1 つだけあることがわかります。そして接続ステータスはESTABLISHEDになります。 httpd.conf で keepAlliveTimeout=15 を設定しているため、接続が確立されてから 15 秒後に接続が閉じられます。

テストの結論

Apache の keep-alive 属性をオフにすると、アクセスしたページ (上記の例では test.html) 内のすべてのファイルが、 js、css、画像などを含むものは、新しい TCP 接続を確立する必要があります。参照ファイルの数と同じ数の接続が存在します。ファイルの特定の数は、Firefox の BUG ツールを使用して表示できます。

上の図の下の 11 個のリクエストは、Web ページ内で参照する必要があるファイルの数です。

Apache の keep-alive 属性を有効にすると、アクセスされたページ (上記の例では test.html) 内のすべてのファイル (js、css、画像などを含む) は TCP 接続のみを確立し、すべてのファイルを順番に転送します。すべてのデータが送信された後、KeepAliveTimeout = 15 秒待ってから接続を閉じます。

インターネットで見られる参考情報:

現在、Apache が 1 秒あたり 100 のユーザー アクセスに応答する場合、KeepAliveTimeOut=5、httpd プロセスの数は 100 になります。 * 5=500 (prefork モード) httpd プロセスが 5M のメモリを消費すると、500*5M=2500M=2.5G になります。もちろん、Apache とクライアントは 100 個の TCP 接続しか確立しませんでした。メモリが十分に大きければシステム負荷はそれほど高くありませんが、メモリが 2.5G 未満の場合はスワップが使用され、頻繁にスワップを切り替えると CPU の負荷が増加します。

KeepAlive をオフにします。画像、js、css などを分離し、訪問ごとにリクエストが 1 つだけあるため、Apache は引き続き 1 秒あたり 100 のユーザー訪問に応答します。この時の 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 秒です。

ブラウザが Web サイトへのアクセスを開始すると開始し、1 秒後に接続を閉じます。 (設定値は少し極端ですが、表示には便利です)。

ブラウザを再起動して Web サイトにアクセスします。

サーバー

仮想マシン上の 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。