2011-11-06 63 views
8

我需要一個PHP cURL配置,以便我的腳本能夠發送請求並忽略由API發送的答案。PHP cURL只需要發送而不是等待響應

curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
//curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); 
$result = curl_exec($ch); 
echo $result; 
curl_close ($ch); 

我嘗試添加: // curl_setopt($ CH,CURLOPT_RETURNTRANSFER,FALSE); // curl_setopt($ ch,CURLOPT_TIMEOUT_MS,100);

但它不能正常工作,並且API Web服務器沒有收到請求。

原因是我向API發送了大量的請求,因此我的腳本非常慢,因爲它等待着每一個請求。

任何幫助表示讚賞。

回答

6

`

public function cccc($test=1) { 
if($test==1) { 
    $url = 'http://examplesite.com/test/cccc/2'; 
    $curl = curl_init();     
    $post['test'] = 'test'; 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt ($curl, CURLOPT_POST, TRUE); 
    curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 

    curl_setopt($curl, CURLOPT_USERAGENT, 'api'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_HEADER, 0); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($curl, CURLOPT_FORBID_REUSE, true); 
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 

    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); 

    $data = curl_exec($curl); 
    echo $data; 


    curl_close($curl); 
} else { 
    ob_end_clean(); 
    header("Connection: close\r\n"); 
    header("Content-Encoding: none\r\n"); 
    header("Content-Length: 1"); 
    ignore_user_abort(true); 

    sleep(10); 
    $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');  

    }} 

//測試

`

+20

不要在代碼中添加任何代碼?這沒用。 –

+1

真棒,它的工作原理,謝謝! –

+0

這有效,但如果你設置的超時時間太短(在我的情況下爲10毫秒),它會在請求完全發送前中斷。 –

0

如何判斷請求是否成功?您需要至少等待來自服務器的狀態碼來確定。如果延遲是問題,請查看curl multi API並行執行多個請求。一旦狀態碼已被返回,您應該能夠設置寫入回調函數以中止接收返回的數據。

3

如果可能的話,你可以在後臺運行wget(使用exec

+0

這不能解決問題。 這相當於背景捲曲,並且仍然會有一個等待響應的進程,消耗計算資源。 – Bladt

2

有點晚了,但現在要解決這個爲任何有興趣的人都需要將CURLOPT_RETURNTRANSFER設置爲TRUE,而不是false。這樣curl_exec函數立即返回一個值,而不是在返回之前等待請求完成 - 即它是異步的而不是同步的。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
+2

Reza問別的東西 – popas

+2

爲什麼這個答案仍然有2分? –

+0

將CURLOPT_RETURNTRANSFER設置爲true可確保我立即得到返回值,而不必等待請求完成。這不是OP要求的嗎? – ljelewis