php中curl_multi批处理请求
来源:互联网 发布:软件知识介绍 编辑:程序博客网 时间:2024/06/06 00:32
curl_multi
同时请求多个url,而不是一个一个依次请求。
步骤总结如下:
1. 调用curl_multi_init
2. 循环调用curl_multi_add_handle(这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle)。
3. 持续调用curl_multi_exec
4. 根据需要循环调用curl_multi_getcontent获取结果
5. 调用curl_multi_remove_handle,并为每个子handle调用curl_close
6. 调用curl_multi_close
resource curl_multi_init(void)
允许并行地处理批处理cURL句柄。成功时返回一个cURL批处理句柄,失败时返回FALSE.
int curl_multi_add_handle(resource $mh, resource $ch)
增加ch句柄到批处理会话mh
参数:mh 由curl_multi_init()返回的cURL多个句柄。
ch 由curl_init()返回的cURL句柄。
成功时返回0,失败时返回CURLM_XXX之一的错误码。
int curl_multi_exec(resource $mh, int &$still_running)
处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。
mh 由curl_multi_init()返回的cURL多个句柄。
still_running 一个用来判断操作是否仍在执行的标识的引用。
返回值
一个定义于cURL预定义常量中的cURL代码。
注意:该函数仅返回关于整个批处理栈相关的错误。即使返回CURLM_OK时单个传输仍可能有问题。
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参数就行了。
string curl_multi_getcontent(resource $ch)
如果CURLOPT_RETURNTRANSFER作为一个选项被设置到一个具体的句柄,那么这个函数将会以字符串的形式返回那个cURL句柄获取的内容。
ch 由curl_init()返回的cURL句柄。
Int curl_multi_select(resource $mh)
阻塞直到cURL批处理连接中有活动连接。
返回值
成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用)。
这个范例将会创建2个cURL句柄,把它们加到批处理句柄,然后并行地运行它们。
//创建一对cURL资源 $ch1=curl_init(); $ch2=curl_init(); //设置URL和相应的选项 curl_setopt($ch1, CURLOPT_URL, "http://404.122.195.246:8089/isactive"); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch1, CURLOPT_HEADER, false); curl_setopt($ch1, CURLOPT_URL, "http://404.122.195.245:8089/isactive"); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch1, CURLOPT_HEADER, false); //创建批处理cURL句柄 $mh=curl_multi_init(); //增加2个句柄 curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); $running=null; //执行批处理句柄 do{ usleep(10000); curl_multi_exec($mh, $running); }while($running>0); //关闭全部句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
批处理
$aUrls=array( "http://402.112.195.246:8089", "http://2.112.195.246:8092", "http://2.112.195.245:8095", "http://2.112.195.246:8094" ); $mh=curl_multi_init(); $aCurlHandles=array(); foreach ($aUrls as $id=>$url){ $url=$url.'/isactive'; $ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10000); $aCurlHandles[$url]=$ch; curl_multi_add_handle($mh, $ch); } $active=null; //执行批处理句柄 do{ $mrc=curl_multi_exec($mh, $active); } while($mrc==CURLM_CALL_MULTI_PERFORM); while($active && $mrc==CURLM_OK){ if(curl_multi_select($mh)==-1){ echo "error<br/>"; usleep(5000); } do{ $mrc=curl_multi_exec($mh, $active); }while($mrc==CURLM_CALL_MULTI_PERFORM); } /*usleep(10000);*/ foreach($aCurlHandles as $url=>$ch){ $html=curl_multi_getcontent($ch); echo $url.'----'.$html.'<br/>'; curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh);
- php中curl_multi批处理请求
- php中curl_multi的应用 同时请求多个url
- PHP使用curl_multi并发请求
- php中curl_multi的应用
- php中curl_multi的应用
- php中curl_multi的应用
- php中curl_multi的应用
- php中curl_multi的应用
- php curl_multi 优化网络请求及多线程
- php curl_multi批量发送http请求
- php curl_multi批量发送http请求
- php中curl_multi的应用 同时请求多个url 【推荐】
- php中curl同时发送多个请求curl_multi函数集的用法
- PHP中CURL_MULTI的使用方法简单示例
- php中curl_multi函数集的用法
- curl_multi实现并发请求
- php curl_multi demo 例子
- PHP curl_multi 多文件下载
- iOS-沙箱
- fireforks上无法正常显示bootstrap图标问题
- 2016.08.29 QLPreviewController相关
- MAC和Window键盘对应关系、Xcode常用快捷键
- vim查找时区别大小写
- php中curl_multi批处理请求
- stl中的remove返回的是什么
- Camshift知识点
- iOS 开发中的八种锁(Lock)
- iOS 解决UITableView复用数据重复
- 8-29
- iOS多线程的简单实现方式
- Linux前台后台进程切换(转载)
- 关于出现 linux Table is marked as crashed and should be repaired