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实现ping
Oct 09 PHP
PHP:风雨欲来 路在何方?
Oct 09 PHP
PHP中路径问题的解决方案
Oct 09 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 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下10件你也许并不了解的事情
2008/09/11 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
javascript String 对象
2008/04/25 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
微信小程序实现时间进度条功能
2020/11/17 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
python 模拟登陆163邮箱
2020/12/15 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
买房子个人收入证明
2014/01/16 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
主要负责人任命书
2014/06/06 职场文书
小学教师培训方案
2014/06/09 职场文书
球队口号
2014/06/18 职场文书
人事专员岗位说明书
2014/07/29 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
离婚代理词范文
2015/05/23 职场文书
httpclient调用远程接口的方法
2022/08/14 Java/Android