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 mkdir()定义和用法
Jan 14 PHP
让PHP支持断点续传的源码
May 16 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
Jun 19 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
php微信公众号开发之图片回复
Oct 20 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 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
犀利的js 函数集合
2009/06/11 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
js控制淡入淡出示例代码
2013/11/12 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
javascript实现多边形碰撞检测
2020/10/24 Javascript
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
init进程的作用
2015/08/20 面试题
中学生班主任评语
2014/01/30 职场文书
房屋继承公证书
2014/04/10 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
教师先进个人材料
2014/12/17 职场文书
春风化雨观后感
2015/06/11 职场文书
新生儿未入户证明
2015/06/23 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
2019旅游导游工作总结
2019/06/27 职场文书