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 中的类
Oct 09 PHP
如何对PHP程序中的常见漏洞进行攻击(下)
Oct 09 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
PHP实现远程下载文件到本地
May 17 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 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
来自PHP.NET的入门教程
2006/10/09 PHP
实用函数3
2007/11/08 PHP
javascript 函数速查表
2010/02/07 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
Django发送html邮件的方法
2015/05/26 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
python如何统计序列中元素
2020/07/31 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Django如何实现上传图片功能
2019/08/16 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
C语言笔试题回忆
2015/04/02 面试题
汉语专业应届生求职信
2013/10/01 职场文书
自我鉴定书范文
2013/10/02 职场文书
资源环境与城市管理专业推荐信
2013/11/30 职场文书
会议活动邀请函
2014/01/27 职场文书
投标售后服务承诺书
2015/04/29 职场文书
演讲开场白台词大全
2015/05/29 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL