PHP 项目 如何进行 性能优化 一 ( PHP 使用上的性能优化)

在开发的过程中,我们经常会遇到php项目如何进行优化的问题,由简单到容易我们往往可以从一下三个方向来考虑
  1. php 语言 使用上的性能优化
  2. php 周边问题的性能优化
  3. php 语言本身的性能优化

  • php语言使用上的性能优化
    大家都知道代码质量是有高低之分的,怎么能提高我们的代码质量呢,其实很简单

    • 少些代码,多尝试使用php本身的功能,例如内置函数,常量
      file

    上图是php代码被执行的过程

    • Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
    • Parsing, 将Tokens转换成简单而有意义的表达式
    • Compilation, 将表达式编译成Opocdes
    • Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

    php的内置函数在php语言开发时就被进行了优化,我们直接使用内置函数可以节省系统ScanningParsing的时间,从而提高我们的性能


  • 内置函数的效率也是有高低的, 要选择效率高的内置函数

  • 尽量避免使用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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

有几点讲的不太好
比如魔术方法,问题本身不在使用魔术方法上,而是有的人在实现魔术方法的时候,写了一堆有问题的代码。
还有减少内存消耗,实际情况用 yield 等生成器之类的例子也很有意义,比如 range 的例子。

6年前 评论

@chenos 谢谢指教 :+1: 是我阅历太浅 考虑不周

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!