PHP 项目 如何进行 性能优化 一 ( PHP 使用上的性能优化)
在开发的过程中,我们经常会遇到php项目如何进行优化的问题,由简单到容易我们往往可以从一下三个方向来考虑
- php 语言 使用上的性能优化
- php 周边问题的性能优化
- php 语言本身的性能优化
-
php语言使用上的性能优化
大家都知道代码质量是有高低之分的,怎么能提高我们的代码质量呢,其实很简单- 少些代码,多尝试使用php本身的功能,例如内置函数,常量
上图是php代码被执行的过程
- Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
- Parsing, 将Tokens转换成简单而有意义的表达式
- Compilation, 将表达式编译成Opocdes
- Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
php的内置函数在php语言开发时就被进行了优化,我们直接使用内置函数可以节省系统
Scanning
和Parsing
的时间,从而提高我们的性能 - 少些代码,多尝试使用php本身的功能,例如内置函数,常量
- 内置函数的效率也是有高低的, 要选择效率高的内置函数
- 尽量避免使用php的魔术方法
魔术方法虽然用起来方便的效率却很低,因为魔术方法虽然为我们省了事,但php内部却为我们做了很多
- 不要使用错误抑制符@
@虽然方便,但原理确实在程序运行开始和结束时增加opcodes
,让系统忽略报错,浪费系统性能
- 合理使用内存
php虽然有内存回收机制,但是还是要注意使用unset()释放未使用的内存
<?php
//定义变量
//变量a 会开辟一个空间
//range()函数 建立一个包含指定范围单元的数组
//memory_get_usage — 返回分配给 PHP 的内存量
$a = range(0, 1000);
var_dump(memory_get_usage());
//定义变量b
//COW copy on write
//这里给b赋值
$b = $a;
var_dump(memory_get_usage());
$a = range(0, 1000);
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());
输出
C:\wamp64\www\redis\queue\test1.php:8:int 374664
C:\wamp64\www\redis\queue\test1.php:15:int 374752
C:\wamp64\www\redis\queue\test1.php:18:int 511264
C:\wamp64\www\redis\queue\test1.php:21:int 374664
- 尽量少使用正则表达式
正则表达式效率很低,开销很大,建议使用字符串处理函数代替正则表达式
- 避免在循环中进行计算,因为这样每次循环都会计算一次
test.php
<?php
$arr=range(1000,100000);
//$length=count($arr);
$sum=0;
for($i=0;$i<count($arr);$i++)
{
$sum=$sum+$arr[$i];
}
echo $sum;
test1.php
<?php
$arr=range(1000,100000);
$length=count($arr);
$sum=0;
for($i=0;$i<$length;$i++)
{
$sum=$sum+$arr[$i];
}
echo $sum;
[root@izuf66bc6zb0cuc0f7x9krz php]# time php test.php
4999550500
real 0m0.033s
user 0m0.023s
sys 0m0.009s
[root@izuf66bc6zb0cuc0f7x9krz php]# time php test1.php
4999550500
real 0m0.028s
user 0m0.021s
sys 0m0.007s
[root@izuf66bc6zb0cuc0f7x9krz php]#
由上面的例子就可以看出 test1.php 比 test.php 效率高
- 不要使用php进行密集型的运算
php的语言特性决定了php不适合做密集型运算,不过等到php7 推出 jit
可能会有改观
-
请务必使用带引号的字符串做键值
因为php会将木有引号的键值当成常量,会产生查找常量的开销
<?php
$arr = ["one" => 1, "two" => 2, "three" => 3, 123 => 4];
echo $arr[one];
输出 1 但会有一个notice 显示找不到常量 one
<?php
define('one', 123);
$arr = ["one" => 1, "two" => 2, "three" => 3, 123 => 4];
echo $arr[one];
输出 4
本篇文章是看 @Yi pangee 我的偶像 吕毅大神的慕课网课程 性能优化之php 的总结 不得不说大神的嗓音真的很有磁性,一不小心就把课程听完了
本作品采用《CC 协议》,转载必须注明作者和本文链接
有几点讲的不太好
比如魔术方法,问题本身不在使用魔术方法上,而是有的人在实现魔术方法的时候,写了一堆有问题的代码。
还有减少内存消耗,实际情况用 yield 等生成器之类的例子也很有意义,比如 range 的例子。
@chenos 谢谢指教 :+1: 是我阅历太浅 考虑不周