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 相关文章推荐
其他功能
Oct 09 PHP
php 安全过滤函数代码
May 07 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
php采用curl实现伪造IP来源的方法
Nov 21 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
PHP验证码生成原理和实现
Jan 24 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
PHP网页缓存技术优点及代码实例
Jul 29 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处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
Python中的元组介绍
2019/01/28 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
曼城官方网上商店:Manchester City
2019/09/10 全球购物
抽象类和接口的区别
2012/09/19 面试题
学生党员思想汇报
2013/12/28 职场文书
授权委托书格式
2014/07/31 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
java设计模式--三种工厂模式详解
2021/07/21 Java/Android