十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
PHP性能分析相关的函数与命令有什么以及性能如何,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
十载的西工网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整西工建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“西工网站设计”,“西工网站推广”以来,每个客户项目都认真落实执行。
我们从PHP是解释性语言、动态语言和底层实现等三个方面,探讨了PHP性能的问题。本文就深入到PHP的微观层面,我们来了解PHP在使用和编写代码过程中,性能方面,可能需要注意和提升的地方。下面创新互联小编来讲解下PHP性能分析相关的函数与命令有什么?PHP性能如何?
一、PHP性能分析相关的函数与命令有什么
1.1、时间度量函数
平时我们常用time()函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的。于是要用microtime函数。而microtime函数可以返回两种形式,一是字符串的形式,一是浮点数的形式。不过需要注意的是,在缺省的情况下,返回的精度只有4位小数。为了获得更高的精确度,我们需要配置precision。
如下是microtime的使用结果。
$start=microtime(true);
echo$start."/n";
$end=microtime(true);
echo$end."/n";
echo($end-$start)."/n";
输出为:
bash-3.2#phptime.php
1441360050.3286
1441360050.3292
0.00053000450134277
而在代码前面加上一行:
ini_set("precision",16);
输出为:
bash-3.2#phptime.php
1441360210.932628
1441360210.932831
0.0002031326293945312
除了microtime内部统计之外,还可以使用getrusage来取得用户态的时长。在实际的操作中,也常用time命令来计算整个程序的运行时长,通过多次运行或者修改代码后运行,得到不同的时间长度以得到效率上的区别。具体用法是:timephptime.php,则在程序运行完成之后,不管是否正常结束退出,都会有相关的统计。
bash-3.2#timephptime.php
1441360373.150756
1441360373.150959
0.0002031326293945312
real0m0.186s
user0m0.072s
sys0m0.077s
因为本文所讨论的性能问题,往往分析上百万次调用之后的差距与趋势,为了避免代码中存在一些时间统计代码,后面我们使用time命令居多。
1.2、内存使用相关函数
分析内存使用的函数有两个:memory_get_usage、memory_get_peak_usage,前者可以获得程序在调用的时间点,即当前所使用的内存,后者可以获得到目前为止高峰时期所使用的内存。所使用的内存以字节为单位。
$base_memory=memory_get_usage();
echo"Hello,world!/n";
$end_memory=memory_get_usage();
$peak_memory=memory_get_peak_usage();
echo$base_memory,"/t",$end_memory,"/t",($end_memory-$base_memory),"/t",$peak_memory,"/n";
输出如下:
bash-3.2#phphelloworld.php
Hello,world!
可以看到,即使程序中间只输出了一句话,再加上变量存储,也消耗了168个字节的内存。
对于同一程序,不同PHP版本对内存的使用并不相同,甚至还差别很大。
$baseMemory=memory_get_usage();
classUser
{
private$uid;
function__construct($uid)
{
$this->uid=$uid;
}
}
for($i=0;$i<100000;$i++) 10000="==0)" obj="newUser($i);" php52memory.php="" 0:93784bytes="" 10000:93784bytes="" 80000:93784bytes="" 90000:93784bytes="" peak:262144bytes="" phpmemory.php="" 0:634992bytes="" 10000:634992bytes="" 80000:634992bytes="" 90000:634992bytes="" peak:786432bytes="" php56memory.php="" 0:224944bytes="" 10000:224920bytes="" 80000:224920bytes="" 90000:224920bytes="" php7memory.php="" 0:353912bytes="" 10000:353912bytes="" 80000:353912bytes="" 90000:353912bytes="" peak:2097152bytes="" obj-="">self=$obj;
代码如下:
$baseMemory=memory_get_usage();
classUser
{
private$uid;
function__construct($uid)
{
$this->uid=$uid;
}
}
for($i=0;$i<100000;$i++) obj="newUser($i);" obj-="">self=$obj;
if($i%5000===0)
{
echosprintf('%6d:',$i),memory_get_usage(),"bytes/n";
}
}
echo"peak:",memory_get_peak_usage(true),"bytes/n";
这时候再来看看内存的使用情况,中间表格主体部分为内存使用量,单位为字节。
二、PHP性能如何
下面我们根据小程序来验证一些常见的性能差别。
2.1、使用echo还是print
在有的建议规则中,会建议使用echo,而不使用print。说print是函数,而echo是语法结构。实际上并不是如此,print也是语法结构,类似的语法结构,还有多个,比如list、isset、require等。不过对于PHP7以下PHP版本而言,两者确实有性能上的差别。如下两份代码:
for($i=0;$i<1000000;$i++) { echo("Hello,World!"); } for($i=0;$i<1000000;$i++) timephpecho1.php="">/dev/null
real0m0.233s
user0m0.153s
sys0m0.080s
[root@localhostphpperf]#timephpecho1.php>/dev/null
real0m0.234s
user0m0.159s
sys0m0.073s
[root@localhostphpperf]#timephpecho.php>/dev/null
real0m0.203s
user0m0.130s
sys0m0.072s
[root@localhostphpperf]#timephpecho.php>/dev/null
real0m0.203s
user0m0.128s
sys0m0.075s
在PHP5.3版中效率差距10%以上。而在PHP5.4以上的版本中,区别不大,如下是PHP7中的运行效率。
[root@localhostphpperf]#timephp7echo.php>/dev/null
real0m0.151s
user0m0.088s
sys0m0.062s
[root@localhostphpperf]#timephp7echo.php>/dev/null
real0m0.145s
user0m0.084s
sys0m0.061s
[root@localhostphpperf]#timephp7echo1.php>/dev/null
real0m0.140s
user0m0.075s
sys0m0.064s
[root@localhostphpperf]#timephp7echo1.php>/dev/null
real0m0.146s
user0m0.077s
sys0m0.069s
正如浏览器前端的一些优化准则一样,没有啥特别通用的原则,往往根据不同的情况和版本,规则也会存在不同。
2.2、require还是require_once?
在一些常规的优化规则中,会提到,建议使用require_once而不是require,现由是require_once会去检测是否重复,而require则不需要重复检测。
在大量不同文件的包含中,require_once略慢于require。但是require_once的检测是一项内存中的行为,也就是说即使有数个需要加载的文件,检测也只是内存中的比较。而require的每次重新加载,都会从文件系统中去读取分析。因而require_once会比require更佳。咱们也使用一个例子来看一下。
str.php
global$str;
$str="Chinahasalargepopulation";
require.php
for($i=0;$i<100000;$i++){ require"str.php"; } require_once.php for($i=0;$i<100000;$i++){ require_once"str.php"; } 上面的例子,在PHP7中,require_once.php的运行速度是require.php的30倍!在其他版本也能得到大致相同的结果。 [root@localhostphpperf]#timephp7require.php real0m1.712s user0m1.126s sys0m0.569s [root@localhostphpperf]#timephp7require.php real0m1.640s user0m1.113s sys0m0.515s [root@localhostphpperf]#timephp7require_once.php real0m0.066s user0m0.063s sys0m0.003s [root@localhostphpperf]#timephp7require_once.php real0m0.057s user0m0.052s sys0m0.004s 从上可以看到,假如存在大量的重复加载的话,require_once明显优于require,因为重复的文件不再有IO操作。即使不是大量重复的加载,也建议使用require_once,因为在一个程序中,一般不会存在数以千百计的文件包含,100次内存比较的速度差距,一个文件包含就相当了。
关于PHP性能分析相关的函数与命令有什么以及性能如何问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。