Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php curl\u multi\u exec-完成一个调用后停止所有调用_Php_Curl Multi - Fatal编程技术网

Php curl\u multi\u exec-完成一个调用后停止所有调用

Php curl\u multi\u exec-完成一个调用后停止所有调用,php,curl-multi,Php,Curl Multi,当一个调用成功完成时,是否可以取消curl\u multi中所有正在运行的调用?似乎curl_multi会等到所有进程完成后再完成脚本,但这可能是我自己的看法。我试图调用一个有许多打开连接的URL。URL将尽可能快地处理请求,当第一个请求返回时,我希望关闭其余的连接并继续调用脚本的其余部分 $outArr = array(); $master = curl_multi_init(); $curl_arr = array(); $url = (isset($_SERVER['HTTPS']) &

当一个调用成功完成时,是否可以取消curl\u multi中所有正在运行的调用?似乎curl_multi会等到所有进程完成后再完成脚本,但这可能是我自己的看法。我试图调用一个有许多打开连接的URL。URL将尽可能快地处理请求,当第一个请求返回时,我希望关闭其余的连接并继续调用脚本的其余部分

$outArr = array();
$master = curl_multi_init();
$curl_arr = array();

$url = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
$std_options = array(CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_MAXREDIRS => 5);

for ($i = 0; $i < 30; $i++) {
    //set custom URL so we can see which one completed.
    $std_options[CURLOPT_URL] = $url.'/sub_proc.php?somearg='.$somearg.'&tlimit='.$tlimit.'&i='.$i;

    $ch = curl_init();
    curl_setopt_array($ch,$std_options);
    curl_multi_add_handle($master, $ch);
}

do {
    while(($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
    if($execrun != CURLM_OK)
        break;
    // a request was just completed -- find out which one
    while($done = curl_multi_info_read($master)) {
        $info = curl_getinfo($done['handle']);
        if ($info['http_code'] == 200)  {
            $output = curl_multi_getcontent($done['handle']);

            // request successful.  process output using the callback function.
            $out = json_decode($output);
            $outArr = $out['board'];
        $running = false;
        break;
        //I want the code above to break all processing requests and 
        //continue with the script outside of this loop.
        } else {
            // request failed.  add error handling.
        }
    }
} while ($running);
curl_multi_close($master);

//does not execute until all requests are complete,
//causing timeouts when one failed request takes > 30 seconds
print_r($outArr);
$outArr=array();
$master=curl_multi_init();
$curl_arr=array();
$url=(isset($_服务器['HTTPS'])和($_服务器['HTTPS']='on')?'HTTPS':'http'):/'。$_服务器['http_主机]]目录名($_服务器['PHP_SELF']);
$std_options=array(CURLOPT_RETURNTRANSFER=>true,
CURLOPT_FOLLOWLOCATION=>true,
CURLOPT_MAXREDIRS=>5);
对于($i=0;$i<30;$i++){
//设置自定义URL,以便查看哪个URL已完成。
$std_options[CURLOPT_URL]=$URL./sub_proc.php?somearg='.$somearg.&tlimit='.$tlimit.&i='.$i;
$ch=curl_init();
curl_setopt_数组($ch,$std_选项);
卷曲多加手柄($master,$ch);
}
做{
而($execrun=curl\u multi\u exec($master,$running))==CURLM\u CALL\u multi\u PERFORM);
如果($execrun!=CURLM_OK)
打破
//一个请求刚刚完成--找出哪一个
而($done=curl\u multi\u info\u read($master)){
$info=curl_getinfo($done['handle']);
如果($info['http_code']==200){
$output=curl\u multi\u getcontent($done['handle']);
//请求成功。使用回调函数处理输出。
$out=json_解码($output);
$outArr=$out['board'];
$running=false;
打破
//我希望上面的代码能够中断所有处理请求和
//继续此循环之外的脚本。
}否则{
//请求失败。添加错误处理。
}
}
}同时($运行);
卷曲多合($master);
//直到所有请求完成后才执行,
//当一个失败的请求超过30秒时导致超时
打印(输出);

Hmmm,一个有趣的问题-如果破坏多句柄会发生什么<代码>$master=NULL;unset(主)我试试看。这个问题源于递归蛮力n皇后编码挑战。我已经让我现有的代码在22秒内处理75个皇后,使用550KB内存,在77秒内处理100个皇后,使用1MB内存,但我想在30秒内处理100个皇后。要做到这一点,我需要在30秒内完成一个近乎完美的布局,这可以通过增加进程或线程的数量来实现。由于PHP没有多线程,我可以使用curl_multi来增加线程的数量。然后我可以打破100皇后屏障。实际上,你不需要更多的进程或线程来实现这一点,用纯PHP在几秒钟内就可以发出几百个HTTP请求(假设你有带宽)——我从来没有使用过
curl\u multi.*
,但是,你对套接字编程有多大信心?通过使用非阻塞套接字,可以做到这一点,并且您可以更细粒度地控制何时发生的事情,并且您可以轻松地随时中止,因为您可以绝对控制底层套接字,因此您可以随意关闭它们。