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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
php截取后台登陆密码的代码
May 05 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
php通过session防url攻击方法
Dec 10 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 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新建文件自动编号的思路与实现
2011/06/27 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
php搜索文件程序分享
2015/10/30 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
pandas如何处理缺失值
2019/07/31 Python
python线程join方法原理解析
2020/02/11 Python
人力资源行政经理自我评价
2013/10/23 职场文书
医院护士的求职信
2014/01/03 职场文书
八项规定整改方案
2014/02/21 职场文书
人代会标语
2014/06/30 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
单位实习鉴定评语
2015/01/04 职场文书
裁员通知
2015/04/25 职场文书
开天辟地观后感
2015/06/09 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python