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 相关文章推荐
五个PHP程序员工具
May 26 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
PHP临时文件的安全性分析
Jul 04 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
php实现微信模板消息推送
Mar 30 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
Aug 17 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php pdo连接数据库操作示例
Nov 18 PHP
php修改word的实例方法
Nov 17 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 CI框架插入一条或多条sql记录示例
2014/07/29 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
拖动时防止选中
2017/02/03 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python实现Kmeans聚类算法
2020/06/10 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
python中while和for的区别总结
2019/06/28 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
学校学雷锋活动总结
2014/06/26 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技