2017-01-12 17 views
0

リクエスト間でHTTP永続接続を使用できる方法はありますか? CURL拡張機能には、mysql、redis、pgの他の拡張機能があるので、すべての要求で使用される接続プールを作成する方法がありません。PHPと永続的なHTTP接続

私は、同じリクエスト内でのみ持続的なhttp接続を使用できることを確認しました。

Silviu

答えて

1

pecl_http拡張子がlibcurlのを使用して、あなたが再利用できる持続的なTCP接続を開くことができます:

$client = new http\Client('curl', $persistentHandleID); 
$request = new http\Client\Request('GET', 'http://example.com/'); 
$client->enqueue($request); 
$client->send(); 
$response = $client->getResponse($request); 

$clientは同じPHPプロセスで実行されている場合は(おそらく別のPHP要求中を)が同じホストにアクセスし、同じ$persistentHandleIDを共有する場合、以前と同じTCP接続を介してHTTP要求を送信します。

PHPモジュールがシャットダウンされるまで、TCP接続が生かされるか$clientConnection: Closeまたはforbids further use of the connectionを送るまで: `ヘッダーは次のとおりです。

$client->setOptions(['forbid_reuse' => true, … ]); 
+0

ありがとうジョー、これは私が探しているものです! – silviu

0

HTTPでは、キープアライブとパイプライニングという概念があります。キープアライブでは、1つのTCP接続を複数のHTTP要求と応答で使用できます。これにより、ブラウザは、1つのTCP接続上にすべてのリソース(例えば、画像、スクリプトなど)を有するウェブページをロードすることができ、これにより、接続のセットアップおよび切断のオーバーヘッドが回避される。 CURLはこれをデフォルトでで使用し、ヘッダーにConnection: keep-aliveを追加します。サーバーは、最大リクエスト数と接続がオープンされたままになる時間を設定します。しかし、依然として要求 - 応答モードで動作します。

パイプライン化では、応答を受信する前に複数の要求を行うことができます。パイプライン処理は広く実装されておらず、クライアントとサーバーの両方で機能する必要があります。 CURLで使用するには、クライアントのためにそれを実装するライブラリ(そこにいくつかあります)を見つけなければなりません。また、サーバもそれを利用しなければなりません。

CURLアプリがキープアライブヘッダーを送信しているかどうかわからない場合は、httpプロキシまたはパケットスニッファーを使用してトラフィックを検査します。 PHPのための

+0

HTTPで/ 1.1持続的な接続がデフォルトなし'接続されていますそれに必要なもの。 PHPプログラムが必要とするのは、後続のリクエストを行うときに同じカールハンドルを再利用することだけです。 –

+0

私の質問は次のとおりです。リクエスト間でHTTP永続接続を使用する方法はありますが、最後の投稿でも同様です。私が見るところでは、同じリクエスト内でのみ永続的なHTTP接続を使用できます。 phpスクリプトのライフサイクルのため、私はあなたが接続のプールをどのように使用できるかわかりません。 – silviu

関連する問題