0

外部休息サービスを頻繁に呼び出す関数があります。入力データに依存する頻度。ユーザーが要求するものですが、アイデアは、特別な種類のデータと識別子をバッチ変換することです。これは、わずか 50 回の変換でも非常に遅くなります。

REST Web サービスは php_curl で呼び出されます。今、私は、単一のコンバージョンごとに新しい接続を作成することがこれを引き起こしていると考えました. 同じハンドルを再利用して、呼び出しごとにURLを調整しようとしましたが、これも試しました:

http://technosophos.com/content/connection-sharing-curl-php-how-re-use-http-connections-knock-70-rest-network-time

どちらの場合もパフォーマンスの向上はありませんでした。私はWindowsを使用しています。多分それが問題ですか?TCPView ツールを使用すると、新しい接続が「まとめて」作成されていることが簡単にわかります。解釈が間違っているのかもしれませんが、コンバージョンごとに 1 つの接続がまだ作成されているように見えます。

だから私はちょっと迷っています。Windowsの実装で接続が実際に再利用されているかどうかは誰にもわかりますか? リモートサーバーが原因でしょうか?

編集:

現在の設定は簡単です:

if(empty($this->curlHandle)){
    $this->curlHandle = curl_init();
    curl_setopt($this->curlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($this->curlHandle, CURLOPT_PROXY, $this->proxy);
    curl_setopt($this->curlHandle, CURLOPT_PROXYPORT, $this->proxyPort);
    curl_setopt($this->curlHandle, CURLOPT_HTTP_VERSION, 1.1);
}        
//$ch = curl_init();
curl_setopt($this->curlHandle, CURLOPT_URL, $baseUrl . $identifier . '/' . $format);


$result = curl_exec($this->curlHandle);

そして、ここにサンプル呼び出しによって返されたヘッダーがあります:

HTTP/1.1 200 OK
Date: Fri, 28 Sep 2012 05:23:37 GMT
Server: Apache/2.2.15 (Scientific Linux)
Last-Modified: Fri, 28 Sep 2012 05:16:37 GMT
ETag: "0924166dd08dd5845929794dbd07d288"
Expires: Mon, 08 Oct 2012 05:16:37 GMT
Cache-Control: max-age=864000
Access-Control-Allow-Origin: *
Connection: close
Content-Type: text/plain; charset=UTF-8

編集2:

同様の機能を提供する別のリモート Web サービスがあります (ただし、ID のルックアップ データなどのデータは少ない)。Firefox で実行すると、そのサービスはキープアライブ ヘッダーを送り返します。だから私はそれを実装しました。しかし、問題は残ります。同じくらい遅い。次に、curl cmd-line を使用して遊んでみましたが、curl を使用すると、サーバーが接続を返すことに気付きました。

4

2 に答える 2

1

同じCURLハンドルを再利用しても、さまざまな理由で実際にはうまく機能しません。curl_execその使用法を実際に意図したものではありませんでした。

はその状況を非常にうまく処理しますcurl_multi_exec ただし、通常は、リモートホストも接続を維持する必要があります。

ただし、これらの戦略のいずれかが機能する前に、クライアントとサーバーは接続を開いたままにすることに同意する必要があり、それは起こっていないことです。

上記で投稿したヘッダーによると、「Connection:close」がサーバーから返されます。これは、Keep-alivesが有効になっていないことを意味します。これは、RESTサーバー(またはプロキシサーバーがある場合はプロキシサーバー)がそれらを許可していないことが原因である可能性があります。これは理にかなっている可能性があります。また、ローカルCURL呼び出しが、何らかの理由で「接続:キープアライブ」をリモートサーバーに送信していないことが原因である可能性もあります。

次のことを試してください。

  • CURLのアウトバウンドヘッダーをチェックして、Keep-aliveを要求するかどうかを確認します。
  • CURLOPT_VERBOSEを有効にしてみてください。これにより、低レベルの接続の詳細が出力されます。

それらは少なくともあなたを正しい軌道に乗せるはずです。ただし、結局のところ、リモートサーバーが同じ接続を介した複数の要求をサポートしていない場合、それを変更するために自分の側で何もすることはできません。

于 2012-10-26T18:53:11.580 に答える
0

バッチ処理を行っているため、curl_multi_exec と並行して複数の呼び出しを実行できます

http://php.net/manual/en/function.curl-multi-exec.php

于 2012-09-28T05:28:05.850 に答える