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(1) php开发环境配置
Feb 15 PHP
PHP排序算法的复习和总结
Feb 15 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
php把大写命名转换成下划线分割命名
Apr 27 PHP
PHP常用技巧汇总
Mar 04 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 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获取服务器信息的实现代码
2013/02/04 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
document.all与WEB标准
2020/05/13 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
Python3中的bytes和str类型详解
2019/05/02 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
变长双向rnn的正确使用姿势教学
2021/05/31 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android