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 学习路线与时间表
Feb 21 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
使用php实现截取指定长度
Aug 06 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
php利用事务处理转账问题
Apr 22 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
php自动加载代码实例详解
Feb 26 PHP
PHP 裁剪图片
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 JSON 数据解析代码
2010/05/26 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
浅谈python写入大量文件的问题
2018/11/09 Python
详解python解压压缩包的五种方法
2019/07/05 Python
python用match()函数爬数据方法详解
2019/07/23 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
地理科学专业自荐信
2014/09/01 职场文书
三年级学生期末评语
2014/12/26 职场文书
陕西导游词
2015/02/04 职场文书
七年级作文之秋游
2019/10/21 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers