我想使用curl_multi执行一些异步请求,但我想在当时创建一组请购单,因为当请购单的响应满足我的需求时,我打算停止所有请求。这是我的代码:
//chunks the array into minor arrays
$chunks = array_chunk($likes, 8);
//Counter var
$cont = 0;
//Array of results
$ofertas = array();
foreach ($chunks as $likes)
{
$codCategoria = $categorias[$categoria];
//In this function 'getOfertas' is the multi_curl request
$respostas = getOfertas($likes, $codCategoria);
//Iterates in the array of results of the multi_curl
foreach ($respostas as $json)
{
$resposta = json_decode($json, true);
//If the json obtained is no empty
if ($resposta['num_and'] > 0)
{
echo "cont: $cont <br>";
//Increment counter and put the response into the array $ofertas
$cont++;
$i = array_rand($resposta['ofertas']);
$oferta = $resposta['ofertas'][$i];
array_push ($ofertas, $oferta);
//If i have already 4 ou more results exit the loop, because i only need 4 of then
if ($cont >= 4)
break;
}
}
}
return $ofertas;
这是getOfertas()里面的函数,带有curl_multi代码
function parallelGet($urls)
{
print_r($urls);
$res = array();
// Create get requests for each URL
$mh = curl_multi_init();
foreach($urls as $i => $url)
{
$ch[$i] = curl_init($url);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $ch[$i]);
#echo "request ";
}
// Start performing the request
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
// Loop and continue processing the request
while ($runningHandles && $execReturnValue == CURLM_OK) {
// Wait forever for network
$numberReady = curl_multi_select($mh);
if ($numberReady != -1) {
// Pull in any new data, or at least handle timeouts
do {
$execReturnValue = curl_multi_exec($mh, $runningHandles);
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
}
}
// Check for any errors
if ($execReturnValue != CURLM_OK) {
trigger_error("Curl multi read error $execReturnValue\n", E_USER_WARNING);
}
// Extract the content
foreach($urls as $i => $url)
{
// Check for errors
$curlError = curl_error($ch[$i]);
if($curlError == "") {
$res[$i] = curl_multi_getcontent($ch[$i]);
} else {
print "Curl error on handle $i: $curlError\n";
}
// Remove and close the handle
curl_multi_remove_handle($mh, $ch[$i]);
curl_close($ch[$i]);
}
// Clean up the curl_multi handle
curl_multi_close($mh);
// Print the response data
return $res;
}
答案 0 :(得分:0)
你应该扩展并实现回调事件的方法
/**
* OnLoad callback event.
*
* @param string $url URL for downloading.
* @param string $content Downloaded content.
* @param array $info CURL session information.
*/
protected abstract function onLoad($url, $content, $info);