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 相关文章推荐
paypal即时到账php实现代码
Nov 28 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
PHP命名空间和自动加载类
Apr 03 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
php插件Xajax使用方法详解
Aug 31 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
PHP7 其他语言层面的修改
Mar 09 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 缓冲的免费实现方法
2006/10/09 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python装饰器代替set get方法实例
2019/12/19 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
九年级家长会邀请函
2014/01/15 职场文书
小学语文国培感言
2014/03/04 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
北京英语导游词
2015/02/12 职场文书
大学生自荐信范文
2015/03/05 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
银行服务理念口号
2015/12/25 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL