2012-09-27 27 views
0

我有一個調用外部休息服務的功能。多久取決於輸入數據,例如。用戶請求的內容是批量轉換特殊類型的數據和標識符。即使只有50次轉換,這個速度也很慢。PHP cURL:在執行大量REST調用時提高性能

使用php_curl調用REST Web服務。現在我認爲爲每次轉換創建一個新的連接正在造成這種情況。我試圖reusign相同的手柄和每個呼叫調整網址,我也試過這樣:

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

我在這兩種情況下0的性能提升。我在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服務提供類似的功能(但數據較少,例如I的查找數據d)。在Firefox中運行時,服務會發送保持活動標題。所以我實現了它。但問題依然存在。同樣緩慢。然後我使用curl cmd-line來玩弄,並注意到當使用curl時,所述服務器返回一個連接:關閉。

+2

不是持久連接是http 1.1的一部分而不是http 1.0的一部分嗎?您可能想要檢查1.1是否被實際使用,請求持久性,並且服務器實際上支持它。 – arkascha

+0

是啊,我的壞。在用FF和Firebug調用服務的輝煌(明顯的)想法之後,我看到服務器返回了一個連接:close header。我試着發送一個Connection:keep-alive頭,但沒有效果。我怎樣才能看到使用哪個http版本? –

+0

有兩個相關的cURL選項:CURLOPT_MAXCONNECTS和CURLOPT_HTTP_VERSION,查看文檔。持久連接是http 1.1中的默認連接,curl支持AFAIK。那是什麼樣的服務器? – arkascha

回答

1

重新使用相同的捲曲手柄真的不適合的原因有多種工作那麼好。 curl_exec並非真正用於此用途。

curl_multi_exec確實處理這種情況非常好。但它通常會要求遠程主機保持連接狀態。然而,在這些策略中的任何一個工作之前,客戶端和服務器必須同意保持連接開放,這就是沒有發生的事情。

根據上面張貼的標題,「Connection:close」從服務器返回。這意味着Keep-alives沒有啓用。這可能是因爲REST服務器(或者您的代理服務器,如果有的話)不允許它們,這可能有一定的意義。這也可能是因爲你是本地CURL呼叫是由於某種原因不向遠程服務器發送「連接:保持活動」。

嘗試以下操作:

  • 檢查捲曲的出站頭,看它是否要求一個保持有效。
  • 嘗試啓用CURLOPT_VERBOSE,這將噴涌出低級別的連接細節

那些至少應該讓你在正確的軌道上。但是,在一天結束時,如果遠程服務器不支持通過同一連接的多個請求,那麼您將無法做任何事情來改變這一點。

+0

好的。沒有考慮代理,實際上有一個代理。更有趣的是,代理的行爲有所不同,具體取決於用戶代理(也涉及認證...)。所以在瀏覽器中一切都很好,連接保持活着,但不是從捲曲。所以我想我做什麼並不重要,問題不能解決。 –

0

既然你是配料,你可以用curl_multi_exec

並行執行多個呼叫

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

+0

這會使「應用程序」設計過於複雜。這是爲了讓用戶上傳文件並獲取包含轉換的文件。爲簡單起見,輸入逐行讀取,輸出逐行寫入,因此同步捲曲調用。但是看起來我只能忍受這一點。 –