PHP实现的CURL非阻塞调用类


Posted in PHP onJuly 26, 2018

本文实例讲述了PHP实现的CURL非阻塞调用类。分享给大家供大家参考,具体如下:

前面一篇《PHP实现非阻塞模式的方法》文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现。

基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类。

欢迎测试bug~~~~~

/*****************************************************
 CURL 非阻塞调用类
 Auther: Linvo
 Copyright(C) 2010/10/21
*******************************************************/
/*
  // 使用范例
  // 传入参数说明
  // url 请求地址
  // data POST方式数据
  //并发调用
  $param1 = array(
      array(
        'url' => "http://localhost/a.php?s=1",
        ),
      array(
        'url' => "http://localhost/a.php?s=1",
        'data' => array('aaa' => 1, 'bbb' => 2),
        ),
      );
  //单个调用
  $param2 = array(
      'url' => "http://localhost/a.php?s=0",
      'data' => array('aaa' => 1, 'bbb' => 2),
      );
  //单个调用(GET简便方式)
  $param3 = 'http://localhost/a.php?s=2';
  $ac = new AsyncCURL();
  $ac->set_param($param1);
  $ret = $ac->send();
  //返回值为请求参数顺序的结果数组(元素值为False表示请求错误)
  var_dump($ret);
*/
class AsyncCURL
{
  /**
   * 是否需要返回HTTP头信息
   */
  public $curlopt_header = 0;
  /**
   * 单个CURL调用超时限制
   */
  public $curlopt_timeout = 20;
  private $param = array();
  /**
   * 构造函数(可直接传入请求参数)
   *
   * @param array 可选
   * @return void
   */
  public function __construct($param = False)
  {
    if ($param !== False)
    {
      $this->param = $this->init_param($param);
    }
  }
  /**
   * 设置请求参数
   *
   * @param array
   * @return void
   */
  public function set_param($param)
  {
    $this->param = $this->init_param($param);
  }
  /**
   * 发送请求
   *
   * @return array
   */
  public function send()
  {
    if(!is_array($this->param) || !count($this->param))
    {
      return False;
    }
    $curl = $ret = array();
    $handle = curl_multi_init();
    foreach ($this->param as $k => $v)
    {
      $param = $this->check_param($v);
      if (!$param) $curl[$k] = False;
      else $curl[$k] = $this->add_handle($handle, $param);
    }
    $this->exec_handle($handle);
    foreach ($this->param as $k => $v)
    {
      if ($curl[$k])
      {
        $ret[$k] = curl_multi_getcontent($curl[$k]);
        curl_multi_remove_handle($handle, $curl[$k]);
      } else {
        $ret[$k] = False;
      }
    }
    curl_multi_close($handle);
    return $ret;
  }
  //以下为私有方法
  private function init_param($param)
  {
    $ret = False;
    if (isset($param['url']))
    {
      $ret = array($param);
    } else {
      $ret = isset($param[0]) ? $param : False;
    }
    return $ret;
  }
  private function check_param($param = array())
  {
    $ret = array();
    if (is_string($param))
    {
      $url = $param;
    } else {
      extract($param);
    }
    if (isset($url))
    {
      $url = trim($url);
      $url = stripos($url, 'http://') === 0 ? $url : NULL;
    }
    if (isset($data) && is_array($data) && !empty($data))
    {
      $method = 'POST';
    } else {
      $method = 'GET';
      unset($data);
    }
    if (isset($url)) $ret['url'] = $url;
    if (isset($method)) $ret['method'] = $method;
    if (isset($data)) $ret['data'] = $data;
    $ret = isset($url) ? $ret : False;
    return $ret;
  }
  private function add_handle($handle, $param)
  {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $param['url']);
    curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout);
    if ($param['method'] == 'POST')
    {
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']);
    }
    curl_multi_add_handle($handle, $curl);
    return $curl;
  }
  private function exec_handle($handle)
  {
    $flag = null;
    do {
      curl_multi_exec($handle, $flag);
    } while ($flag > 0);
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
QueryPath PHP 中的jQuery
Apr 11 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
ajax 的post方法实例(带循环)
Jul 04 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
PHP中实现生成静态文件的方法缓解服务器压力
Jan 07 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
ThinkPHP5框架缓存查询操作分析
May 30 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
PHP等比例压缩图片的实例代码
Jul 26 #PHP
PHP实现非阻塞模式的方法分析
Jul 26 #PHP
php实现等比例压缩图片
Jul 26 #PHP
PHP输出Excel PHPExcel的方法
Jul 26 #PHP
PHP微信H5支付开发实例
Jul 25 #PHP
php app支付宝回调(异步通知)详解
Jul 25 #PHP
php支付宝APP支付功能
Jul 29 #PHP
You might like
浅析php数据类型转换
2014/01/09 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
Python注释详解
2016/06/01 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
python找出完数的方法
2018/11/12 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python实现微信小程序支付功能
2019/07/25 Python
Django学习之文件上传与下载
2019/10/06 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python pandas如何向excel添加数据
2020/05/22 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
社区居务公开实施方案
2014/03/27 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
小学数学教学随笔
2015/08/14 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
进行数据处理的6个 Python 代码块分享
2022/04/06 Python