最新消息:

Yun_Curl_Multi/ curl_multi的用法

php admin 3401浏览 0评论

上周离职了,开始找工作,得来闲空,写点东西。

PHP手册中对curl_multi的描述太不全了,各种版本的实现也有,之前一直就想写这个东西,终于在今天下午写了一个类封装了一下, 应该能满足大多数的应用场景。

代码 https://github.com/walu/yun-lib/blob/master/f1/Yun/Curl/Multi.php

//详细api请参阅代码相应方法注释

$ycm = new Yun_Curl_Multi();
$option = array(CURLOPT_RETURNTRANSFER=>true);

$url_conn[$url] = $ycm->addUrl($url, $option);
$url_conn[$url] = $ycm->addUrl($url, $option);
$url_conn[$url] = $ycm->addUrl($url, $option);

//每一次请求结束后都会立即调用callback
//适合bigpipe类应用
$ycm->doAndCallback($callback_function);

//或者这么用
//所有请求结束后返回结果
$content = $ycm->doAndGetResult();//所有请求结束后返回结果

curl multi 的用法

  • 先建立multi handler
  • 第一次调用exec,生成与服务器的链接
  • 循环调用exec,非阻塞形式的执行请求。期间注意select,否则cpu会被循环搞到发飙的。

需要注意的地方

### curl_multi_exec的调用方法

这里是造成大家迷惑的主要地方,为什么有的demo用了CURLM_CALL_MULTI_PERFORM返回值检查,有的demo却没有。这个 地方很简单,查阅一下curl的手册便可以了。

curl_multi_exec在底层调用了libcurl的curl_multi_perform函数。在curl7.20.0以前,此函数会返回一个CURLM_CALL_MULTI_PERFORM 值,代表它希望立刻再一次被调用(文档)。所以就有了检查此返回值,再一次调用curl_multi_exec函数的demo。在7.20.0(含)之后, libcurl把这个工作自己在内部做了,所以就不用应用端再做了,直接调用curl_multi_exec,只检查$still_running参数就行了。

左边的是curl7.19.7,右边的是7.20.0,一看便知

vim-diff-curl-7.20-7.19

这里就有人可能会全都按照7.19.7的来写,我觉得不是很妥。因为毕竟curl在逻辑上把这个返回值给弃用了,说不定哪天php中的curl扩展 也会去掉这个常量的,从而因为使用过期的api而导致系统故障。

select 问题

没有select的话,cpu会因为循环而飙的很高,这当然不是我们希望看到的。所以必须用curl_multi_select函数来阻塞。

如果是bigpipe应用,一定要用callback

检查一下你的代码,是否为等待所有请求结束后才执行业务逻辑的?如果是,则快改正吧。

转载请注明:爱开源 » Yun_Curl_Multi/ curl_multi的用法

您必须 登录 才能发表评论!