PHP封装请求类实例分析【基于Yii框架】


Posted in PHP onOctober 17, 2019

本文实例讲述了PHP封装请求类。分享给大家供大家参考,具体如下:

1.源码

<?php
namespace app\common\components;
use Yii;
use app\common\services\BaseService;
class HttpClient extends BaseService{
  private static $headers = [];
  private static $cookie = null;
  public static function get($url, $param =[]) {
    return self::curl($url, $param,"get");
  }
  public static function post($url, $param,$extra = [] ) {
    return self::curl($url, $param,"post");
  }
  protected static function curl($url, $param, $method = 'post')
  {
    $calculate_time1 = microtime(true);
    // 初始华
    $curl = curl_init();
    // 设置url
    curl_setopt($curl, CURLOPT_URL, $url);
    // 设置为0表示不返回HTTP头部信息
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 设置为1返回将curl_exec()获取的信息以字符串返回,而不是直接输出 设置为0返回true/false
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    // TRUE 将在安全传输时输出 SSL 证书信息到 STDERR。
    curl_setopt($curl, CURLOPT_CERTINFO , true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // FALSE 禁止 cURL 验证对等证书
    // 交换证书可以在 CURLOPT_CAINFO 选项中设置,CURLOPT_CAPATH中设置证书目录。
      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
      if( isset( Yii::$app->params['curl'] ) && isset(Yii::$app->params['curl']['timeout']) ){
      curl_setopt($curl, CURLOPT_TIMEOUT, Yii::$app->params['curl']['timeout']);
    }else{
      curl_setopt($curl, CURLOPT_TIMEOUT, 5);
    }
    // array_key_exists — 检查数组里是否有指定的键名或索引
      // CURLOPT_USERAGENT在HTTP请求中包含一个"User-Agent: "头的字符串
    if(array_key_exists("HTTP_USER_AGENT",$_SERVER)){
      curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    }
    // CURLOPT_HTTPHEADER设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100')
    if(!empty(self::$headers)){
      $headerArr = [];
      foreach( self::$headers as $n => $v ) {
        $headerArr[] = $n .': ' . $v;
      }
      curl_setopt ($curl, CURLOPT_HTTPHEADER , $headerArr ); //构造IP
    }
    // CURLOPT_COOKIE设定 HTTP 请求中"Cookie: "部分的内容。多个 cookie 用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。
    if( self::$cookie ){
      curl_setopt($curl, CURLOPT_COOKIE, self::$cookie);
    }
    // post处理 :TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
    if ($method == 'post')
    {
      curl_setopt($curl, CURLOPT_POST, TRUE);
      // 如果为数组就变成字符串
      if(is_array($param)){
        $param = http_build_query($param);
      }
      // 全部数据使用HTTP协议中的 "POST" 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。
      curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
    }else{
      //get请求
      curl_setopt($curl, CURLOPT_POST, FALSE);
    }
    // 执行输出
    $info = curl_exec($curl);
    //log:返回最后一次的错误代码
    $_errno = curl_errno($curl);
    $_error = '';
    if($_errno)
    {
      // 返回当前会话最后一次错误的字符串
      $_error = curl_error($curl);
    }
    curl_close($curl);
    // 花费的时间
    $calculate_time_span = microtime(true) - $calculate_time1;
    $log = \Yii::$app->getRuntimePath().DIRECTORY_SEPARATOR.'curl.log';
    // int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
    file_put_contents($log,date('Y-m-d H:i:s')." [ time:{$calculate_time_span} ] url: {$url} \nmethod: {$method} \ndata: ".json_encode($param)." \nresult: {$info} \nerrorno: {$_errno} error: {$_error} \n",FILE_APPEND);
    if( $_error ){
      return self::_err( $_error );
    }
    return $info;
  }
  public static function setHeader($header){
     self::$headers = $header;
  }
  public static function setCookie( $cookie ){
    self::$cookie = $cookie;
  }
}

2.分析

microtime()
函数返回当前 Unix 时间戳的微秒数。
当设置为 TRUE 时,规定函数应该返回一个浮点数,否则返回一个字符串。默认为 FALSE。

详细的各种分析写在代码里面了

3.总结

总结就是get与post差不多(初始化执行关闭) 选项也差不多  就是在方式上面会有些差别!

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
在JavaScript中调用php程序
Mar 09 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
用php实现选择排序的解决方法
May 04 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
Jun 17 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
使用laravel指定日志文件记录任意日志
Oct 17 #PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 #PHP
thinkPHP事务操作简单案例分析
Oct 17 #PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 #PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 #PHP
TP5框架请求响应参数实例分析
Oct 17 #PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 #PHP
You might like
短波的认识
2021/03/01 无线电
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
php链表用法实例分析
2015/07/09 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
php7 新增功能实例总结
2020/05/25 PHP
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
python聊天程序实例代码分享
2013/11/18 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python类中self参数用法详解
2020/02/13 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Python如何实现线程间通信
2020/07/30 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
大学生创业计划书的格式要求
2013/12/29 职场文书
六十大寿答谢词
2014/01/12 职场文书
大学军训感言400字
2014/03/11 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
《西门豹》教学反思
2016/02/23 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python