ホームページ >バックエンド開発 >PHPチュートリアル >PHPタイムアウト処理の総まとめ(1)_PHPチュートリアル
【概要】
PHP 開発では、タイムアウト処理が使用されるシナリオが数多くあります。
1. データの非同期取得 特定のバックエンド データ ソースが正常に取得されなかった場合。スキップしても、ページ全体の表示には影響しません
2. 1つのページの処理パフォーマンスが悪いためにWebサーバーが他のページにアクセスできなくなることを防ぐために、特定のページ操作設定が設定されます
3. 特定のアップロードや不確実な処理の場合は、プロセス全体のすべてのタイムアウトを無限に設定する必要があります。そうしないと、リンクの設定が不適切であると、原因不明の実行中断が発生します
4. 複数のバックエンド モジュール (MySQL、Memcached、HTTP)。インターフェース)、単一のインターフェースを防ぐため パフォーマンスが低すぎるため、フロント全体のデータ取得が遅くなり、ページを開く速度に影響を及ぼし、雪崩を引き起こします
5。 。 。タイムアウトが必要になる場面は多々あります
こういったところでタイムアウトの設定を考える必要がありますが、PHPにおけるタイムアウトはいくつかのカテゴリーに分かれており、それぞれの処理方法や戦略が異なりますので、仕組みを説明する目的でまとめてみました。 PHP でよく使用されるタイムアウト処理。
[Webサーバーのタイムアウト処理]
[Apache]
通常、パフォーマンスが非常に高い場合、デフォルトのタイムアウト設定は30秒ですが、ファイルのアップロードやネットワーク速度が非常に遅い場合、タイムアウト操作が発生します。引き起こされる可能性があります。
現在、Apache fastcgi php-fpm モードには 3 つのタイムアウト設定があります:
fastcgi タイムアウト設定:
httpd.conf の fastcgi 接続構成を次のように変更します:
<ol class="dp-xml"> <li class="alt"><span><span class="tag"><</span><span class="tag-name">IfModule</span><span> mod_fastcgi.c</span><span class="tag">></span><span> </span></span></li> <li><span> FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock </span></li> <li class="alt"><span> </span></li> <li><span> ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/" </span></li> <li class="alt"><span> </span></li> <li><span> AddHandler php-fastcgi .php </span></li> <li class="alt"><span> </span></li> <li><span> Action php-fastcgi /fcgi-bin/php-cgi </span></li> <li class="alt"><span> </span></li> <li><span> AddType application/x-httpd-php .php </span></li> <li class="alt"><span> </span></li> <li> <span class="tag"></</span><span class="tag-name">IfModule</span><span class="tag">></span><span> </span> </li> </ol>
デフォルトの構成は 30 秒です。独自の設定をカスタマイズする必要がある場合は、設定をたとえば 100 秒に変更する必要があります: (変更後に Apache を再起動します):
<ol class="dp-xml"> <li class="alt"><span><span class="tag"><</span><span class="tag-name">IfModule</span><span> mod_fastcgi.c</span><span class="tag">></span><span> </span></span></li> <li><span> </span></li> <li class="alt"><span> FastCgiExternalServer /home/forum/apache/apache_php/cgi-bin/php-cgi -socket /home/forum/php5/etc/php-fpm.sock -idle-timeout 100 </span></li> <li><span> </span></li> <li class="alt"><span> ScriptAlias /fcgi-bin/ "/home/forum/apache/apache_php/cgi-bin/" </span></li> <li><span> </span></li> <li class="alt"><span> AddHandler php-fastcgi .php </span></li> <li><span> </span></li> <li class="alt"><span> Action php-fastcgi /fcgi-bin/php-cgi </span></li> <li><span> </span></li> <li class="alt"><span> AddType application/x-httpd-php .php </span></li> <li><span> </span></li> <li class="alt"> <span class="tag"></</span><span class="tag-name">IfModule</span><span class="tag">></span><span> </span> </li> </ol>
タイムアウトになると、500 エラーが返され、バックエンド PHP から切断されますサービスを起動し、Apache エラー ログを記録します:
<ol class="dp-xml"> <li class="alt"><span><span>[Thu Jan 27 18:30:15 2011] [error] [client 10.81.41.110] FastCGI: comm with server "/home/forum/apache/apache_php/cgi-bin/php-cgi" aborted: idle timeout (30 sec) </span></span></li> <li><span> </span></li> <li class="alt"><span>[Thu Jan 27 18:30:15 2011] [error] [client 10.81.41.110] FastCGI: incomplete headers (0 bytes) received from server "/home/forum/apache/apache_php/cgi-bin/php-cgi" </span></li> </ol>
Other fastcgi 設定パラメータの説明:
<ol class="dp-xml"> <li class="alt"><span><span>IdleTimeout 发呆时限 </span></span></li> <li><span>ProcessLifeTime 一个进程的最长生命周期,过期之后无条件kill </span></li> <li class="alt"><span> </span></li> <li><span>MaxProcessCount 最大进程个数 </span></li> <li class="alt"><span> </span></li> <li><span>DefaultMinClassProcessCount 每个程序启动的最小进程个数 </span></li> <li class="alt"><span> </span></li> <li><span>DefaultMaxClassProcessCount 每个程序启动的最大进程个数 </span></li> <li class="alt"><span> </span></li> <li><span>IPCConnectTimeout 程序响应超时时间 </span></li> <li class="alt"><span> </span></li> <li><span>IPCCommTimeout 与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的 </span></li> <li class="alt"><span> </span></li> <li><span>MaxRequestsPerProcess 每个进程最多完成处理个数,达成后自杀 </span></li> </ol>
[Lighttpd]
Configuration: lighttpd.conf
Lighttpd 設定では、タイムアウトに関するパラメータは次のとおりです (スペース用)考慮事項、書き込み読み取りタイムアウトのみ、書き込みタイムアウト パラメーターは同じです):
主に関係するオプション:
<ol class="dp-xml"> <li class="alt"><span><span class="attribute">server.max-keep-alive-idle</span><span> = </span><span class="attribute-value">5</span><span> </span></span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-read-idle</span><span> = </span><span class="attribute-value">60</span><span> </span> </li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.read-timeout</span><span> = </span><span class="attribute-value">0</span><span> </span> </li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-connection-idle</span><span> = </span><span class="attribute-value">360</span><span> </span> </li> </ol>
<ol class="dp-xml"> <li class="alt"><span><span>-------------------------------------------------- </span></span></li> <li><span> </span></li> <li class="alt"><span># 每次keep-alive 的最大请求数, 默认值是16 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-keep-alive-requests</span><span> = </span><span class="attribute-value">100</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># keep-alive的最长等待时间, 单位是秒,默认值是5 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-keep-alive-idle</span><span> = </span><span class="attribute-value">1200</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># lighttpd的work子进程数,默认值是0,单进程运行 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-worker</span><span> = </span><span class="attribute-value">2</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># 限制用户在发送请求的过程中,最大的中间停顿时间(单位是秒), </span></li> <li><span> </span></li> <li class="alt"><span># 如果用户在发送请求的过程中(没发完请求),中间停顿的时间太长,lighttpd会主动断开连接 </span></li> <li><span> </span></li> <li class="alt"><span># 默认值是60(秒) </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-read-idle</span><span> = </span><span class="attribute-value">1200</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># 限制用户在接收应答的过程中,最大的中间停顿时间(单位是秒), </span></li> <li><span> </span></li> <li class="alt"><span># 如果用户在接收应答的过程中(没接完),中间停顿的时间太长,lighttpd会主动断开连接 </span></li> <li><span> </span></li> <li class="alt"><span># 默认值是360(秒) </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-write-idle</span><span> = </span><span class="attribute-value">12000</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># 读客户端请求的超时限制,单位是秒, 配为0表示不作限制 </span></li> <li><span> </span></li> <li class="alt"><span># 设置小于max-read-idle时,read-timeout生效 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.read-timeout</span><span> = </span><span class="attribute-value">0</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># 写应答页面给客户端的超时限制,单位是秒,配为0表示不作限制 </span></li> <li><span> </span></li> <li class="alt"><span># 设置小于max-write-idle时,write-timeout生效 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.write-timeout</span><span> = </span><span class="attribute-value">0</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span># 请求的处理时间上限,如果用了mod_proxy_core,那就是和后端的交互时间限制, 单位是秒 </span></li> <li><span> </span></li> <li class="alt"> <span class="attribute">server.max-connection-idle</span><span> = </span><span class="attribute-value">1200</span><span> </span> </li> <li><span> </span></li> <li class="alt"><span>-------------------------------------------------- </span></li> </ol>
説明:
キープアライブ接続での連続したリクエストの場合、最初のリクエストのコンテンツを送信する最大間隔は次のとおりです。 2 番目のリクエスト以降、リクエストが送信されます。コンテンツの最大間隔は、パラメータ max-keep-alive-idle によって決まります。リクエスト間のタイムアウトも max-keep-alive-idle によって決まります。リクエストコンテンツの送信の合計タイムアウトは、パラメータ read-timeout によって決まります。 Lighttpd がバックエンドと対話するためのタイムアウトは、max-connection-idle によって決まります。
詳しい読み方:
http://www.snooda.com/read/244
[Nginx]
設定: nginx.conf
<ol class="dp-xml"> <li class="alt"><span><span>http { </span></span></li> <li><span> </span></li> <li class="alt"><span> #Fastcgi: (针对后端的fastcgi 生效, fastcgi 不属于proxy模式) </span></li> <li><span> </span></li> <li class="alt"><span> fastcgi_connect_timeout 5; #连接超时 </span></li> <li><span> </span></li> <li class="alt"><span> fastcgi_send_timeout 10; #写超时 </span></li> <li><span> </span></li> <li class="alt"><span> fastcgi_read_timeout 10; #读取超时 </span></li> <li><span> </span></li> <li class="alt"><span> </span></li> <li><span> </span></li> <li class="alt"><span> #Proxy: (针对proxy/upstreams的生效) </span></li> <li><span> </span></li> <li class="alt"><span> proxy_connect_timeout 15s; #连接超时 </span></li> <li><span> </span></li> <li class="alt"><span> proxy_read_timeout 24s; #读超时 </span></li> <li><span> </span></li> <li class="alt"><span> proxy_send_timeout 10s; #写超时 </span></li> <li><span> </span></li> <li class="alt"><span>} </span></li> </ol>
説明:
Nginx のタイムアウト設定は非常に明確で簡単です。上記のタイムアウトはさまざまな動作モードのものですが、タイムアウトによって引き起こされる問題は数多くあります。
詳しい読み方:
http://hi.baidu.com/pibuchou/blog/item/a1e330dd71fb8a5995ee3753.html
http://hi.baidu.com/pibuchou/blog/item/7cbccff0a3b77dc60b46e024.html
http ://hi.baidu.com/pibuchou/blog/item/10a549818f7e4c9df703a626.html
http://www.apoyl.com/?p=466
1