# 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_once`。`include`效率好于`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. 适时关闭远程资源连接如数据库,`ftp`,`socket`等,适时清理这些资源 ## 性能检测工具 1. `Web Server` 2. `ab` 3. `http_load` 4. `xdebug`