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 相关文章推荐
MySQL修改密码方法总结
Mar 25 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
php实现的xml操作类
Jan 15 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
php的扩展写法总结
May 14 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 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 实例化类的一点摘记
2008/03/23 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
python的pip安装以及使用教程
2018/09/18 Python
python实现年会抽奖程序
2019/01/22 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
django query模块
2019/04/20 Python
python制作简单五子棋游戏
2019/06/18 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
业务经理岗位职责
2013/11/11 职场文书
结婚典礼证婚词
2014/01/11 职场文书
自我反省检讨书
2014/01/23 职场文书
市场专员岗位职责
2014/02/14 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
Django drf请求模块源码解析
2021/06/08 Python
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript