首页->正文

使用curl_multi_init并发请求

2011-03-31 -Web开发 标签: php

因为业务需求,要定时取某接口信息,但常规的逐条查询调用较慢,因此改为并发读取。
看以下PHP的演示代码:
<?php
/*
* 使用curl_multi_init并发请求
*/
error_reporting(E_ALL);

/*测试地址代码
echo "{$_POST['a']} microtime: ", microtime(1);
*/
$url = 'http://test/a.php';

//设置并发请求数据,本例为向接口POST a变量
$url_nodes = array(
     array('a'=>'abc'),
     array('a'=>'123'),
     array('a'=>'xyz'),
);

$s1 = microtime(1);

$result = get_multi_contents($url_nodes, $url);
print_r($result);
echo "Run: ", microtime(1) - $s1;

/*
返回如下信息:
Array
(
    [0] => abc microtime: 1303308559.6719
    [1] => 123 microtime: 1303308559.6875
    [2] => xyz microtime: 1303308559.6719
)
Run: 1.0389590263367
*/

function get_multi_contents($nodes, $url){
     $master = curl_multi_init();

     $node_count = count($nodes);
     $curl_arr = array();
     for($i = 0; $i < $node_count; $i++){
          $params = $nodes[$i];
          //批量初始化curl资源
          $curl_arr[$i] = curl_init($url);
          //设置curl参数
          curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl_arr[$i], CURLOPT_POSTFIELDS, $params);
          //批量增加句柄
          curl_multi_add_handle($master, $curl_arr[$i]);
     }

     $running = null;
     do {
          //执行
          curl_multi_exec($master, $running);
     } while($running > 0);

     for($i = 0; $i < $node_count; $i++){
          $results[$i] = curl_multi_getcontent($curl_arr[$i]);
          //释放句柄
          curl_multi_remove_handle($master, $curl_arr[$i]);
     }
     //务必要关闭资源
     curl_multi_close($master);
     return $results;
}

//EOF

以上方法在接口压力较小时可以考虑,但最优的方案还是提供可供一次查询多条的接口,以减少和接口的交互频率

扩展思考
如何增加超时,以及超时后的重新发送

参考链接
http://cn.php.net/manual/zh/function.curl-multi-init.php

下一篇 页面跳转的方式总结

上一篇 电脑视频输出至电视

相关文章

Ubuntu下编译安装PHP

php增加Last-Modified为何无效

用xhprof分析php代码

正则修饰符m和s用法

用php解析配置文件

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com