PHP性能如何优化


变量

变量的性能排行:局部变量 > 全局变量 > 类属性 > 未定义的变量

  1. 变量大小,注意变量大小是节约内存的最有效的手段。对于来自表单、数据库和文件缓存的数据都需要控制变量的大小。因为CPU要处理的数据是来源于内存。
  2. 变量的有效期,使用unset()函数注销不需要的变量是一种好习惯,将一些不需要的变量立即注销可提高内存的使用率。
  3. 变量类型,初始化变量请注意其变量类型,一个变量在执行过程中,最好只有一种类型状态。
  4. 临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销。
  5. 静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可以考虑使用静态变量,减少程序的CPU执行次数。

循环

  1. 尽量减少循环的次数
  2. 尽量减少循环嵌套的层次
  3. 避免在循环内有过多的业务逻辑
  4. 不要循环包含文件
  5. 不要循环执行数据库操作
  6. 优先使用foreach,它比for、while效率更高
  7. 不要把count、strlen、sizeof放入for循环条件语句中
  8. 保持循环体内的业务逻辑清晰

函数

  1. 函数职责清晰,一个函数只干一件事,不杂糅过多的业务逻辑

  2. 函数代码体不超过20行,反之考虑拆分

  3. 优先使用PHP内置函数

  4. 常量与函数同时能干一件事,优先使用常量

    例如:

    phpversion()    <    PHP_VERSION
    get_class()        <    __CLASS__
    is_null()        <    NULL
    // 等等。。。
  5. echo的性能好于print,输入多个变量的使用echo $str1,$str2,$str3,不用.连接符

  6. 使用$_SERVER['REQUEST_TIME']替换time()

  7. 字符串替换

    strtr()    >    str_replace()    >    preg_replace()    >    epreg()
  8. 发挥trim最大功效,替换substr

    $file_path = trime($filename, '/').'/';
  9. isset/empty虽然两个函数功能有所差异,但在同样情况下推荐使用empty()

  10. isfile/file_exists两个函数的功能有所不同,file_exists既可判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐使用is_file

文件

  1. 减少文件包含数,减少磁盘IO
  2. 使用完整路径,或者容易转换的相对路径。避免在include_path查找
  3. 文件的代码行数不要超过2000行
  4. require_once/include_once效率低于require/include,需要额外的去查看系统是否已经调用过这个文件,因为它们在一个opcode缓存下的调用非常慢。
  5. 程序执行文件用require/require_once,缓存文件用include/include_onceinclude效率好于require
  6. 优化spl中的文件自动加载机制,参考YII
  7. 类库文件加载,是否考虑类是否已实例化,可考虑采用设计模式之单例模式
  8. 文件读写的并发性

面向对象

  1. 控制实例的创建的数量
  2. 优先使用常量、类常量
  3. 优先使用静态变量,静态属性
  4. 类的结构合理
  5. 面向接口编程
  6. 封装变化点
  7. 依赖于抽象,不依赖于细节
  8. 优先使用静态成员
  9. 类的接口清晰稳定,类的职责单一,类与类的通信合理
  10. 使用常量的好处:编译时解析,没有额外的开销,杂凑表更小,所以内部查找更快,类常量仅存在于特定的【命名空间】,所以杂凑名更短,代码更干净,使除错更方便

字符串

用单引号替代双引号引用字符串;避免检索字符串中的变量

运算

  1. i += 1代替i = i + 1,符合C/C++的习惯,效率还高

数组

多维数组尽量不要循环嵌套赋值

判断

  1. 逻辑判断优先使用switch,对于业务逻辑相对较多情况请选择if/else,提高代码的可读性

  2. 尽量控制if/else判断的个数,如果太多请考虑功能优化或代码优化,或使用三元运算符

  3. 尽量使用恒等于用于比较判断,恒等的效率高于等于,而且还能避免一些类型强制转换的错误

  4. if/else&&单条语句判断请选择&&的形式,它的效率高于if/else,如下:

    if ($a == 1) {
        $b = 2;
    }
    // 优化
    ($a == 1) && $b = 2;

缓存

  1. 使用PHP缓存,缓冲opcode
  2. 使用memcache/nosql
  3. 使用内存数据库
  4. 使用文件缓存
  5. 缓冲功能

其他

  1. 少用@符号,严重影响性能
  2. 适时关闭远程资源连接如数据库,ftpsocket等,适时清理这些资源

性能检测工具

  1. Web Server
  2. ab
  3. http_load
  4. xdebug

文章作者: virus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 virus !
 上一篇
数组模拟栈 数组模拟栈
使用数组进行模拟栈的实现 数组初始容量为10进行测试 使用一维数组进行存储元素 选择Object类型,能够存储Java中的任何引用类型的数据 StackMoc.java /** * @ClassName: StackMoc *
下一篇 
给憨憨写的阶乘的实现 给憨憨写的阶乘的实现
给憨憨写的阶乘的实现原理 一个数的阶乘 当这个数 = 1的时候,算式为:1 * (1 - 0) = 1,所以1的阶乘就是1 当这个数 = 2的时候,算式为:2! = 2 * 1 = 2 * (2 - 1) = 2,所以2的阶乘就是 ==前2
2020-05-18
  目录