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 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
php递归删除目录与文件的方法
Jan 30 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
php格式化json函数示例代码
May 12 PHP
ThinkPHP中session函数详解
Sep 14 PHP
PHP new static 和 new self详解
Feb 19 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
深入解读Node.js中的koa源码
2019/06/17 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
中文系师范生自荐信
2013/10/01 职场文书
小学教师岗位职责
2013/11/25 职场文书
住房公积金接收函
2014/01/09 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
开学典礼观后感
2015/06/15 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
欧元符号 €
2022/02/17 杂记
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android