变量
变量的性能排行:局部变量 > 全局变量 > 类属性 > 未定义的变量
- 变量大小,注意变量大小是节约内存的最有效的手段。对于来自表单、数据库和文件缓存的数据都需要控制变量的大小。因为
CPU
要处理的数据是来源于内存。 - 变量的有效期,使用
unset()
函数注销不需要的变量是一种好习惯,将一些不需要的变量立即注销可提高内存的使用率。 - 变量类型,初始化变量请注意其变量类型,一个变量在执行过程中,最好只有一种类型状态。
- 临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销。
- 静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可以考虑使用静态变量,减少程序的
CPU
执行次数。
循环
- 尽量减少循环的次数
- 尽量减少循环嵌套的层次
- 避免在循环内有过多的业务逻辑
- 不要循环包含文件
- 不要循环执行数据库操作
- 优先使用
foreach
,它比for、while
效率更高 - 不要把
count、strlen、sizeof
放入for
循环条件语句中 - 保持循环体内的业务逻辑清晰
函数
函数职责清晰,一个函数只干一件事,不杂糅过多的业务逻辑
函数代码体不超过20行,反之考虑拆分
优先使用
PHP
内置函数常量与函数同时能干一件事,优先使用常量
例如:
phpversion() < PHP_VERSION get_class() < __CLASS__ is_null() < NULL // 等等。。。
echo
的性能好于print
,输入多个变量的使用echo $str1,$str2,$str3
,不用.
连接符使用
$_SERVER['REQUEST_TIME']
替换time()
字符串替换
strtr() > str_replace() > preg_replace() > epreg()
发挥
trim
最大功效,替换substr
$file_path = trime($filename, '/').'/';
isset/empty
虽然两个函数功能有所差异,但在同样情况下推荐使用empty()
isfile/file_exists
两个函数的功能有所不同,file_exists
既可判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐使用is_file
文件
- 减少文件包含数,减少磁盘
IO
- 使用完整路径,或者容易转换的相对路径。避免在
include_path
查找 - 文件的代码行数不要超过2000行
require_once/include_once
效率低于require/include
,需要额外的去查看系统是否已经调用过这个文件,因为它们在一个opcode
缓存下的调用非常慢。- 程序执行文件用
require/require_once
,缓存文件用include/include_once
。include
效率好于require
。 - 优化
spl
中的文件自动加载机制,参考YII
- 类库文件加载,是否考虑类是否已实例化,可考虑采用设计模式之单例模式
- 文件读写的并发性
面向对象
- 控制实例的创建的数量
- 优先使用常量、类常量
- 优先使用静态变量,静态属性
- 类的结构合理
- 面向接口编程
- 封装变化点
- 依赖于抽象,不依赖于细节
- 优先使用静态成员
- 类的接口清晰稳定,类的职责单一,类与类的通信合理
- 使用常量的好处:编译时解析,没有额外的开销,杂凑表更小,所以内部查找更快,类常量仅存在于特定的【命名空间】,所以杂凑名更短,代码更干净,使除错更方便
字符串
用单引号替代双引号引用字符串;避免检索字符串中的变量
运算
- 用
i += 1
代替i = i + 1
,符合C/C++
的习惯,效率还高
数组
多维数组尽量不要循环嵌套赋值
判断
逻辑判断优先使用
switch
,对于业务逻辑相对较多情况请选择if/else
,提高代码的可读性尽量控制
if/else
判断的个数,如果太多请考虑功能优化或代码优化,或使用三元运算符尽量使用恒等于用于比较判断,恒等的效率高于等于,而且还能避免一些类型强制转换的错误
if/else
与&&
单条语句判断请选择&&
的形式,它的效率高于if/else
,如下:if ($a == 1) { $b = 2; } // 优化 ($a == 1) && $b = 2;
缓存
- 使用
PHP
缓存,缓冲opcode
- 使用
memcache/nosql
- 使用内存数据库
- 使用文件缓存
- 缓冲功能
其他
- 少用
@
符号,严重影响性能 - 适时关闭远程资源连接如数据库,
ftp
,socket
等,适时清理这些资源
性能检测工具
Web Server
ab
http_load
xdebug