Maison > Article > Opération et maintenance > Comment PHP se connecte-t-il à Apache avec délai d'attente
Avant-propos
Pour comprendre le problème de délai d'expiration de connexion entre le navigateur et Apache, vous devez d'abord comprendre le de l'attribut http -alive. Commençons par présenter brièvement keep-alive. Vous pouvez trouver une introduction plus détaillée en ligne.
Les navigateurs et Apache sont basés sur le protocole http. L'explication populaire de l'attribut keep-alive dans le protocole http est que le navigateur et Apache établissent une connexion TCP pour la première fois. Une fois les données transmises, la connexion TCP ne sera pas déconnectée immédiatement, mais continuera d'attendre. prochaine demande. La connexion sera déconnectée après un certain temps (keep-alive-time).
Faisons un test pour vérifier l'état de la connexion TCP d'Apache lorsqu'il active le support keep-alive et désactive le support keep-alive.
服务端 | 虚拟机上的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> |
Désactivez d'abord le paramètre keep-alive d'Apache et ouvrez httpd.conf.
Ouvrez le navigateur pour accéder à Apache. Utilisez la commande netstat pour vérifier l'état de la connexion.
#netstat –nt|grep –i '80′
Vous pouvez voir quatre connexions. La vitesse d'accès local étant très rapide, seul l'état TIME_WAIT peut être capturé. Pourquoi la page Web test.html comporte-t-elle quatre liens ?
En regardant le contenu de test.html, on peut savoir qu'il y a :
1, fichier main.css
2, fichier main.js
3, photo principale.jpg
4, le fichier test.html lui-même
donc il y a quatre connexions.
Regardez l'état de la connexion après avoir désactivé le support keep-alive d'Apache.
Redémarrez le serveur, accédez à test.html avec le navigateur et vérifiez la connexion.
#service httpd restart
#netstat –nt|grep –i '80′
Vous pouvez voir qu'il n'y a qu'une seule connexion. Et l'état de la connexion est ÉTABLI. Nous définissons keepAlliveTimeout=15 dans httpd.conf, de sorte que la connexion est fermée 15 secondes après l'établissement de la connexion.
Conclusions du test
Si vous désactivez l'attribut keep-alive d'Apache, tous les fichiers de la page consultée (test.html dans l'exemple ci-dessus), y compris js, css, images, etc. doivent établir une nouvelle connexion TCP. Il existe autant de connexions que de fichiers référencés. Le nombre spécifique de fichiers peut être visualisé à l'aide de l'outil BUG de Firefox.
Les 11 dernières requêtes dans l'image ci-dessus correspondent au nombre de fichiers qui doivent être référencés dans la page Web.
Si vous activez l'attribut keep-alive d'Apache, tous les fichiers de la page consultée (test.html dans l'exemple ci-dessus), y compris js, css, images, etc., établiront uniquement une connexion TCP et transférer tous les fichiers dans l'ordre. Attendez KeepAliveTimeout = 15 secondes après la transmission de toutes les données avant de fermer la connexion.
Références vues sur Internet :
Si Apache répond actuellement à 100 visites d'utilisateurs par seconde, KeepAliveTimeOut=5, alors le nombre de processus httpd est de 100 * 5=500 (mode prefork). Si un processus httpd consomme 5M de mémoire, c'est 500*5M=2500M=2.5G. Bien entendu, Apache et Client n'ont établi que 100 connexions TCP. Si votre mémoire est suffisamment grande, la charge du système ne sera pas trop élevée. Si votre mémoire est inférieure à 2,5 Go, la commutation Frequent Swap augmentera la charge sur le processeur.
Maintenant, nous désactivons KeepAlive, Apache répond toujours à 100 visites d'utilisateurs par seconde, car nous avons séparé les images, js, css, etc., et il n'y a qu'une seule requête par visite. À cette époque, le nombre de processus httpd était de 100*1=100 et la mémoire utilisée était de 100*5M=500M. À cette époque, Apache et le client établissaient également 100 connexions TCP. Les performances se sont beaucoup améliorées.
Délai d'expiration de connexion du navigateur
Chaque navigateur a un délai d'expiration de connexion par défaut. La durée par défaut pour IE6 est de 60 minutes.
Cette valeur peut être modifiée via le registre.
1. Ouvrez le registre : HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionParamètres Internet.
2. Ajoutez un élément avec une valeur DWORD, nommez-le ReceiverTimeout et définissez-le sur 1000. L'unité par défaut de cette valeur est la milliseconde et le temps défini ici est de 1 seconde.
Démarrez lorsque le navigateur commence à accéder au site Web et fermez la connexion après 1 seconde. (La valeur réglée est un peu extrême, mais elle est pratique pour l'affichage).
Redémarrez le navigateur pour accéder au site Web.
服务端 | 虚拟机上的Centos |
客户端 | 本机上IE6浏览器 |
服务端地址 | 192.168.212.128 |
客户端地址 | 192.168.212.1 |
访问的文件index.php | <?php echo date('H:i:s',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教程栏目进行学习!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!