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出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
深入php之规范编程命名小结
May 15 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
PHP7新增函数
Mar 09 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/03 冲泡冲煮
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php合并js请求的例子
2013/11/01 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python中的tuple元组详细介绍
2015/02/02 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Python实现带百分比的进度条
2016/06/28 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python 简单的调用有道翻译
2020/11/25 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
美国内衣品牌:Leonisa
2016/08/14 全球购物
十一个高级MySql面试题
2014/10/06 面试题
人事专员职责
2014/02/22 职场文书
个人课题方案
2014/05/08 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
2019军训心得体会
2019/06/27 职场文书
python 管理系统实现mysql交互的示例代码
2021/12/06 Python