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 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
php获取参数的几种方法总结
Feb 18 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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中使用gettext来支持多语言的方法
2011/05/02 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
Python类的基础入门知识
2008/11/24 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python二元赋值实用技巧解析
2019/10/25 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
档案接收函
2014/01/13 职场文书
活动宣传策划方案
2014/05/23 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers