ホームページ  >  記事  >  バックエンド開発  >  PHPリクエストインターフェースのタイムアウトを解決する方法

PHPリクエストインターフェースのタイムアウトを解決する方法

王林
王林オリジナル
2019-09-29 17:48:066152ブラウズ

PHPリクエストインターフェースのタイムアウトを解決する方法

[HTTP アクセス]

通常、私たちはさまざまな方法で HTTP にアクセスします。主に、curl、socket、file_get_contents() などのメソッドです。

相手のサーバーが応答しなかったら悲惨なことになりますが、サーバーごと強制終了することも簡単なので、http アクセス時のタイムアウトの問題も考慮する必要があります。

[CURL アクセス HTTP]

CURL は、HTTP プロトコル インターフェイスにアクセスするために一般的に使用される信頼性の高い lib ライブラリです。高いパフォーマンスといくつかの同時実行サポートを備えています。関数、等

CURL:

curl_setopt($ch, opt) は、主に次のようないくつかのタイムアウト設定を設定できます。

CURLOPT_TIMEOUT Set 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 秒です。

curl の通常の第 2 レベルのタイムアウト:

$ch =curl_init();

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 60); //設定する必要があるのは秒数のみです

curl_setopt( $ ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_USERAGENT, $define_vars['HTTP_USER_AGENT']);

curl の通常の第 2 レベルのタイムアウトの使用法:

curl_setopt($ch, CURLOPT_TIMEOUT, 60);

curl でミリ秒のタイムアウトが必要な場合は、次を追加する必要があります:

curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L );

Or:

curl_setopt ($ch, CURLOPT_NOSIGNAL, true); ミリ秒レベルのタイムアウト設定をサポートできます

curl のミリ秒タイムアウトの例:

<?php
if (!isset($_GET[&#39;foo&#39;])) {
    
// Client
    $ch = curl_init(&#39;http://example.com/&#39;);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);  
//注意,毫秒超时一定要设置这个
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); 
//超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用
    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);
 
    if ($curl_errno > 0) {
        echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
        echo "Data received: $data\n";
    }
} else {
    
// Server
    sleep(10);
    echo "Done.";
}
?>

その他のヒント:

1. 経験によると、要約は次のとおりです: cURL バージョン >= libcurl /7.21. バージョン 0 では、ミリ秒のタイムアウトが確実に有効になることを覚えておいてください。

2.curl_multi のミリ秒タイムアウトにも問題があります。 。 1 回のアクセスでミリ秒レベルのタイムアウトがサポートされますが、複数の呼び出しが並行して行われる場合、curl_multi は不正確になります。

[ストリーム処理による HTTP へのアクセス]

また、curl では HTTP プロトコルの処理に fsockopen やファイル操作関数を使用することが多いため、これに対するタイムアウト処理も必要です。

推奨チュートリアル: PHP ビデオ チュートリアル

以上がPHPリクエストインターフェースのタイムアウトを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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