[英]ParallelCurl with CURLOPT_WRITEFUNCTION
當cURL從它連接到的服務器接收數據時,我試圖將ParallelCurl與回調一起使用。 這是我目前擁有的代碼:
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();
現在,我希望發生的是在cURL有數據輸出時調用我的匿名函數。 相反,它似乎完全忽略了CURLOPT_WRITEFUNCTION
已設置的事實。
請注意,如果我不使用ParallelCurl,則可以將CURLOPT_WRITEFUNCTION設置為與匿名函數完全相同的匿名函數。 好像我的功能稍后在某個地方被覆蓋。 我還證實了它實際上已被設置。 您可以看到我已注釋掉的行//print_r($pc->options)
。 它輸出我的關閉對象。
任何對此的想法將不勝感激。 謝謝。
事實證明這是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()
,那么它將正常工作。 有趣的是,我在與 CURLPOT_WRITEFUNCTION
相同的數組中傳遞的User-Agent參數工作正常。 因此,當給定對象作為數組中的值時, 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.