2011-03-27 22 views
0

我試圖使用ParallelCurlcallback when cURL receives data from the server它是連接到。這是我目前擁有的代碼:ParallelCurl與CURLOPT_WRITEFUNCTION

function request_finished($content, $url, $ch, $user_data) { 
    echo "Request Finished: ", $content, "\n"; 
} 

$pc=new ParallelCurl(); 
$servers=Server::loadNewAllFromDB(); //Returns an array of 'Server' objects which store connection information 

foreach ($servers as $server) { 

    $pc->setOptions(
     array(
      CURLOPT_USERAGENT=>'My UserAgent String', 
      CURLOPT_WRITEFUNCTION=> 
       function ($ch, $string) { 
        echo "WRITEFUNCTION Called! | ", $string; 
        return strlen($string); 
       } 
     ) 
    ); 
    //print_r($pc->options); 
    $pc->startRequest(
     'http://' . $server->address . ':' . $server->portbase . '/someurl'), 
     'request_finished' 
    ); 

} 

$pc->finishAllRequests(); 

現在,我希望發生是捲曲時,有數據輸出到被稱爲我的匿名函數。相反,它只是似乎忽略CURLOPT_WRITEFUNCTION設置在所有的事實。

需要注意的是,如果我不使用ParallelCurl,我可以設置非常相同的匿名函數作爲CURLOPT_WRITEFUNCTION就好了。就好像我的函數稍後被重寫了一樣。我也證實它實際上正在設定。您可以看到我已註釋的行,//print_r($pc->options)。它輸出我的閉包對象。

任何對此的思考將是非常讚賞。謝謝。

回答

0

這原來是用任一ParallelCurl一個錯誤,或者curl_set_opt_array()。這裏是ParallelCurl的功能,就是:

// Start a fetch from the $url address, calling the $callback function passing the optional 
// $user_data value. The callback should accept 3 arguments, the url, curl handle and user 
// data, eg on_request_done($url, $ch, $user_data); 
public function startRequest($url, $callback, $user_data = array(), $post_fields=null) { 

    if($this->max_requests > 0) 
     $this->waitForOutstandingRequestsToDropBelow($this->max_requests); 

    $ch = curl_init(); 
    curl_setopt_array($ch, $this->options); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

    if (isset($post_fields)) { 
     curl_setopt($ch, CURLOPT_POST, TRUE); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    } 



    curl_multi_add_handle($this->multi_handle, $ch); 

    $this->outstanding_requests[$ch] = array(
     'url' => $url, 
     'callback' => $callback, 
     'user_data' => $user_data, 
    ); 

    $this->checkForCompletedRequests(); 
} 

現在的問題出在哪裏curl_setopt_array($ch, $this->options)坐。如果我移動它下面的所有其他curl_setopt()的,然後它工作正常。有趣的是,是,我的User-Agent參數,我通過同一陣列中CURLPOT_WRITEFUNCTION是工作的罰款。所以,似乎給出對象的數組中的值時curl_setpot_array()表現不同。無論如何,簡單地移動電話運作良好。我修改的功能:

// Start a fetch from the $url address, calling the $callback function passing the optional 
// $user_data value. The callback should accept 3 arguments, the url, curl handle and user 
// data, eg on_request_done($url, $ch, $user_data); 
public function startRequest($url, $callback, $user_data = array(), $post_fields=null) { 

    if($this->max_requests > 0) 
     $this->waitForOutstandingRequestsToDropBelow($this->max_requests); 

    $ch = curl_init(); 


    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

    if (isset($post_fields)) { 
     curl_setopt($ch, CURLOPT_POST, TRUE); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    } 

    curl_setopt_array($ch, $this->options); 

    curl_multi_add_handle($this->multi_handle, $ch); 

    $this->outstanding_requests[$ch] = array(
     'url' => $url, 
     'callback' => $callback, 
     'user_data' => $user_data, 
    ); 

    $this->checkForCompletedRequests(); 
}