64

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

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

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

80 ドキュメント/秒 (100 万ドキュメントのうち) で、PHP および solr ボックスのネットワーク インターフェイスで異常に高い割り込み率に気付きました (2000/秒; さらに、グラフはほぼ同じです。 PHP ボックスの速度が急上昇し、Solr ボックスでも急上昇します) が、データベース ボックスではそれほどではありません (300/秒)。これは単純に、データベース サーバーへの接続を 1 つ開いて再利用したためだと思いますが、Solr クライアント ライブラリの記述方法のおかげで、現在、すべての Solr リクエストが cURL を介して新しい HTTP 接続を開いています。

だから、私の質問は:

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

4 に答える 4

58

cURL PHP ドキュメント ( curl_setopt ) は次のように述べています。

CURLOPT_FORBID_REUSE - TRUE処理が終了したときに接続を強制的に強制的に閉じ、再利用のためにプールされないようにします。

そう:

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

Curl はデフォルトで keep-alive ヘッダーを送信しますが、次のようになります。

  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);
于 2012-04-10T13:32:57.710 に答える
15
  1. アクセスしているサーバーでは、キープアライブが有効になっている必要があり、キープアライブ リクエストの最大数が適切である必要があります。Apache の場合は、 apache docsを参照してください。

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

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

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    
于 2009-11-17T01:25:45.430 に答える
1

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

非同期 PHP 呼び出し?

于 2009-06-10T00:36:53.633 に答える