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 获取远程文件内容的函数代码
Mar 24 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
PHP 导出Excel示例分享
Aug 18 PHP
PHP积分兑换接口实例
Feb 09 PHP
php英文单词统计器
Jun 23 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
Laravel事件监听器用法实例分析
Mar 12 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
用javascript操作xml
2006/11/04 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
element中的$confirm的使用
2020/04/26 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
浅述python中深浅拷贝原理
2018/09/18 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
Unix如何添加新的用户
2014/08/20 面试题
简历中的自我评价怎么写
2014/01/29 职场文书
学校评语大全
2014/05/06 职场文书