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 相关文章推荐
web方式ftp
Oct 09 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
php class类的用法详细总结
Oct 17 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP入门教程之操作符与控制结构流程详解
Sep 09 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
Yii框架应用组件用法实例分析
May 15 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对象转换为数组函数(递归方法)
2012/02/04 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
Python中的pack和unpack的使用
2018/03/12 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
关于python写入文件自动换行的问题
2018/06/23 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
python字符串反转的四种方法详解
2019/12/02 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
十岁生日家长答谢词
2014/01/17 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
青春奉献演讲稿
2014/05/08 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
学会感恩主题班会
2015/08/12 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫