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应用技巧
Mar 27 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
PHP的一个基础知识 表单提交
Jul 04 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
Apr 11 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
npm 下载指定版本的组件方法
2018/05/17 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
Python使用装饰器进行django开发实例代码
2018/02/06 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
采购部主管岗位职责
2014/01/01 职场文书
大学秋游活动方案
2014/02/11 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫