2009-06-09 18 views
52

私は単純なPHPライブラリを使用して、HTTPを介してSOLRインデックスにドキュメントを追加しています。PHP Curlライブラリを使用した永続的/キープアライブHTTP?

現在、関連する3台のサーバがあります

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

80文書/秒(百万文書のうち)で、私はPHPとソルボックスのネットワークインターフェイスで異常に高い割り込みレートに気付いています(2000 /秒;さらにグラフはほぼ同じ - PHPボックスの割り込みレートが急上昇すると、Solrボックスも大きくなりますが、データベースボックス(300 /秒)ではそれほど大きくなりません。これは、データベースサーバーとの1つの接続を開いて再利用するためだと思いますが、Solrクライアントライブラリの記述方法のおかげで、すべての単一のSolrリクエストが現在cURLを介して新しいHTTP接続を開始しています。

だから、私の質問は:

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

さて、私が使用してい私たちは、認証が必要な数多くのページを持つサイト全体を解析し、セッション全体を維持していました。 initalハンドルリソースを使用すると、コマンドを実行してページを取得し、クライアントと同じセッションと接続を維持できます。 コマンドラインを使用すると、これは約20分(私たちのすべてのデータ要件のため、それ以上続くことができます)、再接続する必要はありません。しかし、私はこれがあなたが尋ねているものであるかどうかは分かりません。答えはコメントであり、答えではありません:) –

+0

もう1つのメモは、しばしば、あなたがやっていることとあなたのサーバーに応じて設定する必要があるオプションがありますに接続しています。これについては、ここで詳しく説明しています:http://uk3.php.net/manual/en/function.curl-setopt.php –

+3

FAQのこの部分は、大したことはありませんが、関連性があります.http://curl.haxx .se/docs/faq.html#Can_I_perform_multiple_requests –

答えて

49

cURLのPHPのドキュメント(curl_setopt)は言う:

CURLOPT_FORBID_REUSEからTRUEを、それが処理を完了した、と は、再利用のためにプールされていないときに接続 明示的に近い を強制します。だから、

:デフォルトで

  1. はい、実際にそれがなければならない再利用の接続は、限り、あなたはとしてのcURLハンドルを再使用しています。
  2. デフォルトでは、cURLは永続的な接続を単独で処理します。 CURLOPT_HTTPHEADER
  3. サーバがキープアライブタイムアウトを送信することがある(デフォルトのApacheインストールでは、15秒か100リクエストのどちらか早い方のどちらか早い方) - ただし、cURLはそれが起こったときに別の接続を開くだけです。あなたはキープアライブアクセスしているサーバーで
+1

ブリリアント!私はこれが私の最初のstackoverflow質問を投稿するのに近いです。このソリューションは、リクエストヘッダー 'Connection:close'を追加したミドルウェアで機能しました。 – renevanderark

1

リクエストからの応答を気にしない場合は、非同期に実行できますが、SOLRインデックスのオーバーロードの危険性があります。私はそれを疑う、SOLRはかなり気分がいい。

Asynchronous PHP calls?

+0

これは確かに興味深いですが、接続の再利用についてはまったく言及していません。実際には、接続オーバーヘッドの問題が悪化するだけです。 –

13
  1. 有効にする必要があり、最大キープアライブ要求は合理的でなければなりません。Apacheの場合は、apache docsを参照してください。

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

  3. CURLコンテキストを設定する場合、キープアライブタイムアウトとヘッダーに有効:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive', 
        'Keep-Alive: 300' 
    )); 
    
+0

CURLがデフォルトでKeep-Aliveヘッダーを送信するかどうか疑問に思っています... –

+2

フランク、コードを再テストしただけで、デフォルトでオンになっています。明示的に設定することに傷つけることはできませんでした。 –

+1

@OlegBarshay接続を維持するために、curl_close($ curlHandle);を削除する必要があるかどうかを知っていますか? ? – zeflex

19

カールは、デフォルトではキープアライブヘッダを送信しますが、:

  1. 作成パラメータなしでcurl_init()を使用するコンテキスト。 curl_exec()
  2. を使用して要求を実行コンテキストに
  3. をURLを渡す
  4. 店、それが(ローカルVARない)生き残るスコープのコンテキスト
  5. 使用CURLOPT_URLオプションでは、との接続を閉じないでください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); 
+0

2回目の呼び出しの前にクッキーを設定する必要があります:' curl_setopt($ context、CURLOPT_COOKIE、 'name = value') ;例えば、私のリクエストに対して 'curl_setopt($ context、CURLOPT_COOKIE、 'PHPSESSID = bl392rgi8q664l7faat33hfta4'); –

関連する問題