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代码优化及php相关问题总结
Oct 09 PHP
社区(php&&mysql)六
Oct 09 PHP
php PDO中文乱码解决办法
Jul 20 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
laravel框架创建授权策略实例分析
Nov 22 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 什么是PEAR?(第三篇)
2009/03/19 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python编程线性回归代码示例
2017/12/07 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
Python多线程获取返回值代码实例
2020/02/17 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
技校生自我鉴定
2013/12/08 职场文书
工程质量承诺书
2014/03/27 职场文书
个人租房协议书
2014/04/09 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers