• PHP利用CURL_MULTI实现多线程


    PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就一个利用PHP CURL_MULTI多线程采集网页为例来说明一下。

    01 <?php
    02 //功能:PHP利用CURL_MULTI多线程采集网页函数
    04 print_r($text);
    05 function remote($urls){
    06     if(!is_array($urls)||!count($urls)){
    07         return false;
    08     }
    09     $curl=$text=array();
    10     $handle=curl_multi_init();
    11     foreach($urls as $k=>$v){
    12         //$nurl[$k]=preg_replace('/([^:/.]+)/i',rawurlencode('\1'),$v);
    13         //$curl[$k]=curl_init($nurl[$k]);
    14         $curl[$k]=curl_init($v);
    15         curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER,1);
    16         curl_setopt($curl[$k], CURLOPT_HEADER,0);
    17         curl_multi_add_handle($handle,$curl[$k]);
    18     }
    19     $active = null;
    20     do{
    21         $mrc=curl_multi_exec($handle,$active);
    22     }while($mrc==CURLM_CALL_MULTI_PERFORM);
    23     while($active&&$mrc==CURLM_OK){
    24         if(curl_multi_select($handle)!=-1){
    25             do{
    26                 $mrc=curl_multi_exec($handle,$active);
    27             }while($mrc==CURLM_CALL_MULTI_PERFORM);
    28         }
    29     }
    30      
    31     foreach($curl as $k=>$v){
    32         if(curl_error($curl[$k])==""){
    33             $text[$k]=(string)curl_multi_getcontent($curl[$k]);
    34         }
    35         curl_multi_remove_handle($handle,$curl[$k]);
    36         curl_close($curl[$k]);
    37     }
    38     curl_multi_close($handle);
    39     return $text;
    40 }

    另外我对CURL_MULTI类的函数也做了一下小小的总结,通过查看php手册文档会找出PHP CURL_MULTI类的函数主要有以下几个:

    curl_multi_add_handle

    curl_multi_close

    curl_multi_exec

    curl_multi_getcontent

    curl_multi_info_read

    curl_multi_init

    curl_multi_remove_handle

    curl_multi_select

    调用这些函数实现目的的步骤一般如下:

    第一步:调用curl_multi_init初始化一个curl批处理句柄资源

    第二步:循环调用curl_multi_add_handle向curl批处理会话中添加单独的curl句柄资源(这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle)

    第三步:持续调用curl_multi_exec解析curl批处理句柄

    第四步:根据需要循环调用curl_multi_getcontent返回获取的输出的文本流以获取结果

    第五步:调用curl_multi_remove_handle移除curl批处理句柄资源中的某个句柄资源,并为每个handle调用curl_close

    第六步:调用curl_multi_close关闭批处理句柄资源

    另外需要注意的是PHP 5 版本才可以使用这个函数,必须开启 curl 扩展(打开 php.ini 把;extension=php_curl.dll前面的分号去掉 , 重启apache  就可以使用了)。

  • 相关阅读:
    【codecombat】 试玩全攻略 第九关 循环又循环
    【codecombat】 试玩全攻略 第十三关 已知敌人
    【codecombat】 试玩全攻略 第十一关 再次迷宫经历
    【codecombat】 试玩全攻略 第六关 cell commentary
    【codecombat】 试玩全攻略 第八关 火舞
    【codecombat】 试玩全攻略 第十二关 恐惧之门
    【codecombat】 试玩全攻略 第十四关 已知敌人
    苹果apns推送总结
    Xcode 提升速度小技巧
    UITextField 限制输入字数
  • 原文地址:https://www.cnblogs.com/chunguang/p/5895160.html
Copyright © 2020-2023  润新知