首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在响应发生时立即访问PHP多cURL句柄

如何在响应发生时立即访问PHP多cURL句柄
EN

Stack Overflow用户
提问于 2019-03-05 15:56:39
回答 1查看 289关注 0票数 0

我正在请求具有不同响应时间的多个地址:

代码语言:javascript
复制
$urlList = [
    'https://httpstat.us/200?sleep=3000',
    'https://httpstat.us/200?sleep=1000'
];

$mh = curl_multi_init();

$curlHandlerList = [];
foreach ($urlList as $i => $url) {
    $ch = $curlHandlerList[$i] = curl_init();

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => false,
    ]);

    curl_multi_add_handle($mh, $ch);
}

while (CURLM_OK == curl_multi_exec($mh, $active) && $active) {
    usleep(10**4); // 10**4 microseconds => 0.01 seconds
    curl_multi_select($mh, .01);
}

foreach ($curlHandlerList as $ch) {
    $html = curl_multi_getcontent($ch);

    echo "$html
";
}

是否可以立即访问已经完成的curl处理程序的输出?

EN

回答 1

Stack Overflow用户

发布于 2019-03-05 15:56:39

回答我自己的问题,因为我在任何地方都找不到答案。我没有创建一个多cURL处理程序,而是为需要请求的每个地址创建了一个处理程序。请看下面的代码:

代码语言:javascript
复制
$urlList = [                                                            
    'https://httpstat.us/200?sleep=3000',                               
    'https://httpstat.us/200?sleep=1000'                                
];                                                                      

processList($urlList, function($key, $output) {                         
    echo "Output from {$key}\n{$output}\n\n";                             
});                                                                     

function processList($urlList, $closure) {                              

    $curlHandlerList = $multiCurlHandlerList = [];                      

    foreach ($urlList as $i => $url) {                                  
        $ch = $curlHandlerList[$i] = curl_init();                       
        $mh = $multiCurlHandlerList[$i] = curl_multi_init();            

        curl_setopt_array($ch, [                                        
            CURLOPT_URL => $url,                                        
            CURLOPT_HEADER => false,                                    
            CURLOPT_RETURNTRANSFER => true,                             
            CURLOPT_SSL_VERIFYHOST => false,                            
            CURLOPT_SSL_VERIFYPEER => false,                            
        ]);                                                             

        curl_multi_add_handle($mh, $ch);                                
    }                                                                   

    while (count($multiCurlHandlerList)) {                              
        foreach ($multiCurlHandlerList as $i => $mh) {                  
            if (CURLM_OK != curl_multi_exec($mh, $active) || !$active) {

                $html = curl_multi_getcontent($curlHandlerList[$i]);    

                $closure($i, $html);                                    

                curl_multi_remove_handle($mh, $curlHandlerList[$i]);    
                unset($multiCurlHandlerList[$i], $curlHandlerList[$i]); 
            }                                                           
        }                                                               
        usleep(10**4); // 10**4 microseconds => 0.01 seconds            
    }                                                                   
}     
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54997893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档