web-dev-qa-db-ja.com

PHP Curlライブラリを使用した永続的/キープアライブHTTP?

HTTP経由でSOLRインデックスにドキュメントを追加するために、単純なPHPライブラリを使用しています。

現在、3つのサーバーが関係しています。

  1. インデックス作成ジョブを実行するPHPボックス
  2. インデックス付けされるデータを保持するデータベースボックス
  3. Solrボックス。

80ドキュメント/秒(100万ドキュメントのうち)で、PHPおよびsolrボックス(2000 /秒。さらに、グラフはほぼ同じです-PHPボックスでの割り込み率が急上昇すると、Solrボックスでも急上昇します)、データベースボックスでの低下率は非常に低くなります(300 /秒)。これは単にデータベースサーバーへの単一の接続を開いて再利用するためですが、Solrクライアントライブラリの記述方法のおかげで、現在、すべてのSolrリクエストがcURLを介して新しいHTTP接続を開いています。

だから、私の質問は:

  1. キープアライブセッションを開くようにcURLを作成できますか?
  2. 接続を再利用するには何が必要ですか? -cURLハンドルリソースを再利用するのと同じくらい簡単ですか?
  3. 特別なcURLオプションを設定する必要がありますか? (例:HTTP 1.1を強制しますか?)
  4. CURLキープアライブ接続に関する問題はありますか?このスクリプトは一度に数時間実行されます。単一の接続を使用できますか、または定期的に再接続する必要がありますか?
58
Frank Farmer

cURL PHP documentation( curl_setopt )言います:

CURLOPT_FORBID_REUSE-TRUEは、処理の終了時に接続を明示的に閉じ、再利用のためにプールされないようにします。

そう:

  1. はい、実際には、cURLハンドルを再利用する限り、デフォルトで接続を再利用する必要があります。
  2. デフォルトでは、cURLはそれ自体で永続的な接続を処理します。特別なヘッダーが必要な場合は、CURLOPT_HTTPHEADERを確認してください
  3. サーバーはキープアライブタイムアウトを送信する場合があります(デフォルトのApacheインストールでは、15秒または100リクエストのいずれか早い方)。ただし、cURLはそれが発生すると別の接続を開きます。
53
Piskvor

Curlはデフォルトでキープアライブヘッダーを送信しますが、次のとおりです。

  1. パラメーターなしでcurl_init()を使用してコンテキストを作成します。
  2. コンテキストを(ローカル変数ではなく)存続するスコープに格納します
  3. _CURLOPT_URL_オプションを使用して、URLをコンテキストに渡します
  4. curl_exec()を使用してリクエストを実行します
  5. curl_close()との接続を閉じないでください

非常に基本的な例:

_function get($url) {
    global $context;
    curl_setopt($context, CURLOPT_URL, $url);
    return curl_exec($context);
}

$context = curl_init();
//multiple calls to get() here
curl_close($context);
_
21
Richard Keizer
  1. キープアライブにアクセスしているサーバーで有効にする必要があり、キープアライブ要求の最大数は妥当なものでなければなりません。 Apacheの場合、 Apache docs を参照してください。

  2. 同じcURLコンテキストを再利用する必要があります。

  3. CURLコンテキストを構成する場合、ヘッダーでタイムアウトを使用してキープアライブを有効にします。

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
14
Oleg Barshay

要求からの応答を気にしない場合は、非同期で実行できますが、SOLRインデックスが過負荷になるリスクがあります。私はそれを疑いますが、SOLRは非常に速いです。

非同期PHP呼び出し?

1
Brent