`
javatgo
  • 浏览: 1174624 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

php中curl_multi的应用

阅读更多

相信许多人对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
  • 一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

    步骤总结如下:

    第一步:调用curl_multi_init
    第二步:循环调用curl_multi_add_handle
    这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
    第三步:持续调用curl_multi_exec
    第四步:根据需要循环调用curl_multi_getcontent获取结果
    第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
    第六步:调用curl_multi_close

    这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会说明为何dirty):

    /*
    Here'saquickanddirtyexampleforcurl-multifromPHP,testedonPHP5.0.0RC1CLI/FreeBSD5.2.1
    */

    $connomains=array(
    "http://www.cnn.com/",
    "http://www.canada.com/",
    "http://www.yahoo.com/"
    );

    $mh=curl_multi_init();

    foreach($connomainsas$i=>$url){
    $conn[$i]=curl_init($url);
    curl_setopt(
    $conn[$i],CURLOPT_RETURNTRANSFER,1);
    curl_multi_add_handle(
    $mh,$conn[$i]);
    }

    do{$n=curl_multi_exec($mh,$active);}while($active);

    foreach($connomainsas$i=>$url){
    $res[$i]=curl_multi_getcontent($conn[$i]);
    curl_close(
    $conn[$i]);
    }

    print_r($res);

    整个使用过程差不多就是这样,但是,这个简单代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用100%。

    现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。

    把上面do的那段改成下面这样:

    do{
    $mrc=curl_multi_exec($mh,$active);
    }
    while($mrc==CURLM_CALL_MULTI_PERFORM);
    while($activeand$mrc==CURLM_OK){
    if(curl_multi_select($mh)!=-1){
    do{
    $mrc=curl_multi_exec($mh,$active);
    }
    while($mrc==CURLM_CALL_MULTI_PERFORM);
    }
    }

    因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。

    另外:还有一些细节的地方可能有时候要遇到:

    控制每一个请求的超时时间,在curl_multi_add_handle之前通过curl_setopt去做:
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

    判断是否超时了或者其他错误,在curl_multi_getcontent之前用:curl_error($conn[$i]);

    分享到:
    评论

    相关推荐

      php中的curl_multi系列函数用法例子_.docx

      标题:PHP中curl_multi系列函数的用法实例 PHP作为广泛使用的服务器端脚本语言,在进行网页开发时经常需要与外部资源进行数据交换,而cURL库正是提供了一种方法来完成这个任务。在PHP中,除了单个请求的cURL函数...

      php使用curl_init()和curl_multi_init()多线程的速度比较详解

      在PHP中,`curl_init()` 和 `curl_multi_init()` 是两个用于HTTP请求的重要函数,尤其在数据抓取和网络通信的场景中。`curl_init()` 是一个基础的CURL会话初始化函数,它用于创建一个新的CURL句柄,用于执行单一的...

      PHP用法CURL_MULTI实现多线程采集的例子_.docx

      在实际应用中,可以结合使用`curl_setopt()`设置其他选项,如设置HTTP头、添加cookies、处理重定向、验证SSL证书等。此外,还可以通过`curl_multi_info_read()`获取每个请求的详细信息,以便进行更复杂的错误处理和...

      PHP使用CURL_MULTI实现多线程采集的例子

      在PHP开发中,为了提高网页数据采集的效率,可以利用cURL库提供的CURL_MULTI功能来实现多线程采集。CURL_MULTI接口允许同时处理多个cURL会话,从而达到并发访问HTTP资源的效果,这对于需要从多个源获取数据或者大量...

      详解PHP中curl_multi并发的实现

      在PHP中,`curl_multi` 是一个用于并发执行多个cURL请求的库,它能够显著提高批量处理HTTP请求的效率。传统的单个`curl`请求会阻塞程序,直到请求完成才会继续执行下一条,而`curl_multi`则允许同时处理多个请求,...

      对curlmulti进行简单地封装处理并行请求

      通过封装`curl_multi`,我们可以创建一个强大的工具,简化并行HTTP请求的处理,提高PHP应用的性能。在实际项目中,可以根据需求进一步扩展此类,比如增加超时控制、重试机制、请求优先级管理等功能。

      解析php中curl_multi的应用

      在PHP中,`curl_multi` 是一组用于同时处理多个cURL连接的函数,极大地提高了并发请求的效率。然而,正如标题和描述所提及的,`curl_multi` 功能在某些特定版本的cURL库和PHP环境中可能存在兼容性问题,可能导致在你...

      php中的curl_multi系列函数使用例子

      在PHP编程中,使用cURL库发送HTTP请求是常见的需求,而cURL的多线程请求能力则通过curl_multi系列函数实现。这些函数允许程序员同时处理多个URL的请求,比起顺序执行,使用curl_multi可以大大提高应用的响应速度和...

      PHP使用curl_multi实现并发请求的方法示例

      了解并掌握`curl_multi`的使用,能显著提升PHP应用的性能。此外,`curl_multi`还支持错误处理和回调函数,使得我们可以更精细地控制并发请求的流程,实现更复杂的功能。在实际项目中,可以根据需求对`CurlMultiUtil`...

      CurlMulti 一个php多线程类库

      CurlMulti是PHP中用于处理HTTP请求的多线程库,尤其在进行批量数据抓取或需要并发执行多个HTTP操作时非常有用。它基于libcurl库,提供了对curl_multi_init(), curl_multi_add_handle(), curl_multi_exec(), 和curl_...

      PHP实现的curl批量请求操作示例

      在实际应用中,你可能还需要处理错误,例如检查cURL的错误码,并根据需要添加超时、重试机制,或者使用`CURLOPT_WRITEFUNCTION`回调函数处理响应数据。此外,对于POST请求,可以通过`curl_setopt()`设置`CURLOPT_...

      php扩展 php_curl

      cURL库本身是一个强大的客户端URL传输工具,而`php_curl`扩展则是将这些功能集成到PHP语言中,极大地拓宽了PHP在Web开发中的应用范围。 **一、libeay32.dll和ssleay32.dll** 在启用`php_curl`扩展时,两个重要的...

      PHP 中CURL相关涵数详解

      ### PHP中CURL相关函数详解 #### 一、概述 CURL(Client URL)是PHP中用于处理HTTP请求的强大库之一,它支持多种协议(如HTTP、HTTPS、FTP等),并能够实现各种复杂的网络交互需求。本文将详细介绍PHP中与CURL相关...

      PHP中的CURL函数库.pdf

      在PHP中,CURL函数库(Client URL Library Function)是一个强大的工具,用于处理HTTP和其他协议的请求。这个库提供了一组丰富的函数,使得开发者能够轻松地进行网页抓取、文件上传下载、POST数据等网络操作。以下是...

      PHP curl批处理及多请求并发实现方法分析

      总结来说,PHP的`cURL`批处理和并发功能通过`curl_multi_init()`、`curl_multi_add_handle()`、`curl_multi_exec()`等函数,提供了高效地处理多个网络请求的能力,是PHP开发中不可或缺的工具,尤其在大数据抓取、...

      PHP技巧PHPCURL函数库.doc

      例如:<phpcurl_exec($ch);?> curl_close() 函数用于关闭一个 curls 会话,该函数接受一个参数,即 curls_init() 函数返回的句柄。例如:<phpcurl_close($ch);?> curl_version() 函数用于获取 curls 相关的版本...

      CURL详解 资料.doc

      总之,CURL是PHP中一个不可或缺的工具,它提供了丰富的功能来处理网络请求,无论是在简单的HTTP交互还是复杂的Web抓取场景中,都有其广泛的应用。理解并熟练运用CURL,将极大提升你的PHP编程能力。

      php用法curl并发削减后端访问时间的方法分析_.docx

      通过使用`curl_multi_init()`初始化一个多路复用句柄,并将所有请求添加到这个句柄中,然后调用`curl_multi_exec()`来处理这些请求。这种方式可以显著降低总的响应时间,即使每个网站响应时间仍然是500毫秒左右,但...

    Global site tag (gtag.js) - Google Analytics