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的类 功能齐全的发送邮件类
Oct 09 PHP
mysql 全文搜索 技巧
Apr 27 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
Jul 03 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
php获取文件内容最后一行示例
Jan 09 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 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出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
PHP中读写文件实现代码
2011/10/20 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
Python的迭代器和生成器使用实例
2015/01/14 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python3中的md5加密实例
2018/05/29 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
详解python调用cmd命令三种方法
2019/07/08 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python如何操作docker redis过程解析
2020/08/10 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
小学学雷锋活动总结
2014/04/25 职场文书
听课评语大全
2014/04/30 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
法律进社区活动总结
2015/05/07 职场文书
人民的好儿女观后感
2015/06/18 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python