この記事の例では、PHPでのcurlタイムアウト設定方法について説明します。参考のためにみんなで共有してください。具体的な実装方法は以下の通りです
HTTP にアクセスするには多くの方法があり、curl、socket、file_get_contents() などのメソッドを使用できます。
http にアクセスする場合は、タイムアウトの問題を考慮する必要があります。
CURL アクセス HTTP:
CURL は、HTTP プロトコル インターフェイスにアクセスするために一般的に使用されるライブラリであり、高いパフォーマンスを備え、いくつかの同時実行サポート機能を備えています。
curl_setopt($ch, opt) は、主に以下を含むいくつかのタイムアウト設定を設定できます:
① (重要) CURLOPT_TIMEOUT は、cURL の実行が許可される最大秒数を設定します。
② (重要) CURLOPT_TIMEOUT_MS は、cURL が実行できる最大時間をミリ秒単位で設定します。
(cURL 7.16.2 で追加。PHP 5.2.3 以降で利用可能)
③ CURLOPT_CONNECTTIMEOUT は、接続を開始するまでの待機時間です。0 に設定すると、無期限に待機します。
④ CURLOPT_CONNECTTIMEOUT_MS 接続試行の待機時間 (ミリ秒)。 0 に設定すると、無限に待機します。 (cURL 7.16.2 で追加。PHP 5.2.3 以降で利用可能)
⑤ CURLOPT_DNS_CACHE_TIMEOUT は、DNS 情報をメモリに保存する時間を設定します。デフォルトは 120 秒です。
1. カールの通常の 2 番目のタイムアウト:
コードは次のとおりです:
コードは次のとおりです:
【Webサーバーのタイムアウト処理】
【Apache】
通常、パフォーマンスが高い場合、デフォルトのタイムアウト設定はすべて30秒ですが、ファイルのアップロードやネットワーク速度が非常に遅い場合は、タイムアウトが発生する場合があります。
現在、apachefastcgiphp-fpm モードには 3 つのタイムアウト設定があります:
fastcgi タイムアウト設定:
次のように変更された fastcgi 接続構成:
次のようにコードをコピーします:
FastCgiExternalServer/home/ forum/apache /apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/ "
AddHandlerphp -fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
デフォルトの設定は 30 秒です。独自の設定をカスタマイズする必要がある場合は、 100 秒に変更するなど、構成を変更します: (変更後に apache を再起動します):
次のようにコードをコピーします:
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/ php-cgi-socket/home/forum/php5 /etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi。 php
Actionphp-fastcgi/fcgi-bin/php -cgi
AddTypeapplication/x-
タイムアウトになると、500 エラーが返され、バックエンド php サービスから切断され、 Apache エラー ログ:
[ThuJan2718:30:152011][error] [client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
その他の fastcgi...残り全文はこちら>>
functioncurl_file_get_contents($url){
$starttime = time();
$ch =curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = trim(curl_exec($ch))
$endtime = time();
if($endtime-$starttime>=15){
echo 'php 実行タイムアウト';
}
return $contents;