变量 + 数组 + 架构
变量
4.1 及时销毁变量
数组, 对象和 GLOBAL 变量在 PHP 中特别占内存的, 这个由于 PHP 的底层的 zend 引擎引起的.
一般来说, PHP 数组的内存利用率只有 1/10.
也就是说, 一个在 C 语言里面 100M 内存的数组, 在 PHP 里面就要 1G.
特别是, 在 PHP 作为后台服务器的系统中, 经常会出现内存耗费太大的问题.
4.2 使用 $_SERVER 变量
如果你需要得到脚本执行的时间,$_SERVER['REQUSET_TIME']优于 time().
一个是现成就可以直接用, 一个还需要函数得出的结果.
4.3 方法里建立局部变量
在类的方法里建立局部变量速度最快, 几乎和在方法里调用局部变量一样快.
4.4 局部变量比全局变量快
由于局部变量是存在栈中的.
当一个函数占用的栈空间不是很大的时候, 这部分内存很有可能全部命中 cache,CPU 访问的效率是很高的.
相反, 如果一个函数同时使用全局变量和局部变量, 当这两段地址相差较大时, CPU cache 需要来回切换, 效率会下降.
4.5 局部变量而不是对象属性
建立一个对象属性 (类里面的变量, 例如:$this->prop++) 比局部变量要慢 3 倍.
4.6 提前声明局部变量
建立一个未声明的局部变量, 要比建立一个已经定义过的局部变量慢 9-10 倍.
4.7 谨慎声明全局变量
声明一个未被任何一个函数使用过的全局变量, 也会使性能降低.
这和声明相同数量的局部变量一样, PHP 可能去检查这个全局变量是否存在.
4.8 使用 ++$i 递增
当执行变量 $i 的递增或递减时,$i++ 会比 ++$i 慢一些.
这种差异是 PHP 特有的, 并不适用于其他语言, 所以请不要修改你的 C 或 Java 代码, 并指望它们能立即变快, 没用的.
++$i 更快是因为它只需要 3 条指令(opcodes),$i++ 则需要 4 条指令.
后置递增实际上会产生一个临时变量, 这个临时变量随后被递增.
而前置递增直接在原值上递增.
这是最优化处理的一种, 正如 Zend 的 PHP 优化器所作的那样.
牢记, 这个优化处理不失为一个好主意, 因为不是所有的指令优化器都会做同样的优化处理.
4.9 不要随便复制变量
有时候为了使 PHP 代码更加整洁, 一些 PHP 新手 (包括我) 会把预定义好的变量, 复制到一个名字更简短的变量中.
其实这样做的结果是增加了一倍的内存消耗, 只会使程序更加慢.
试想一下, 在下面的例子中, 如果用户恶意插入 512KB 字节的文字, 就会导致 1MB 的内存被消耗!
4.10 循环内部不要声明变量
尤其是大变量, 这好像不只是 PHP 里面要注意的问题吧?
4.11 一定要对变量进行初始化
这里的 "初始化" 指的是 "声明".
当需要没有初始化的变量, PHP 解释器会自动创建一个变量, 但依靠这个特性来编程并不是一个好主意.
这会造成程序的粗糙, 或者使代码变得另人迷惑.
因为你需要探寻这个变量是从哪里开始被创建的.
另外, 对一个没有初始化的变量进行递增操作要比初始化过的来得慢.
所以对变量进行初始化会是个不错的主意.
数组
5.1 用字符串而不是数组作为参数
如果一个函数既能接受数组, 又能接受简单字符做为参数, 那么尽量用字符作为参数.
例如, 字符替换函数, 参数列表并不是太长, 就可以考虑额外写一段替换代码.
使得每次传递参数都是一个字符, 而不是接受数组做为查找和替换参数.
5.2 数组元素加引号
$row['id']比 $row[id]速度快 7 倍.
如果不带引号, 例如 $a[name], 那么 PHP 会首先检查有没有 define 定义的 name 常量.
如果有, 就用这个常量值作为数组键值. 如果没有, 再查找键值为字符串'name'的数组元素.
多了一个查找判断的过程, 所以建议养成数组键名加引号的习惯.
正如上面字符串部分所述, 用'又比用" 速度更快.
5.3 多维数组操作
多维数组尽量不要循环嵌套赋值.
5.4 循环用 foreach
尽量用 foreach 代替 while 和 for 循环, 效率更高.
架构
6.1 压缩输出
在 PHP.INI 中开启 gzip 压缩:
level 可能是 1-9 之间的数字, 你可以设置不同的数字.
几乎所有的浏览器都支持 Gzip 的压缩方式, gzip 可以降低 80% 的输出.
付出的代价是, 大概增加了 10% 的 CPU 计算量.
但是还是会赚到了, 因为带宽减少了, 页面加载会变得很快.
如果你使用 apache, 也可以激活 mod_gzip 模块.
6.2 静态化页面
Apache/Nginx 解析一个 PHP 脚本的时间, 要比解析一个静态 html 页面慢 2 至 10 倍.
所以尽量使页面静态化, 或使用静态 HTML 页面.
6.3 将 PHP 升级到最新版
提高性能的最简单的方式是不断升级, 更新 PHP 版本.
6.4 利用 PHP 的扩展
一直以来, 大家都在抱怨 PHP 内容太过繁杂.
最近几年来, 开发人员作出了相应的努力, 移除了项目中的一些冗余特征.
即便如此, 可用库以及其它扩展的数量还是很可观.
甚至一些开发人员开始考虑实施自己的扩展方案.
6.5 PHP 缓存
一般情况下, PHP 脚本被 PHP 引擎编译后执行, 会被转换成机器语言, 也称为操作码.
如果 PHP 脚本反复编译得到相同的结果, 为什么不完全跳过编译过程呢?
PHP 加速器缓存了编译后的机器码, 允许代码根据要求立即执行, 而不经过繁琐的编译过程.
对 PHP 开发人员而言, 目前提供了两种可用的缓存方案.
一种是 APC(Alternative PHP Cache, 可选 PHP 缓存), 它是一个可以通过 Pear 安装的开源加速器.
另一种流行的方案是 OPCode, 也就是操作码缓存技术.
6.6 使用 NoSQL 缓存
Memchached 或者 Redis 都可以.
这些是高性能的分布式内存对象缓存系统, 能提高动态网络应用程序性能, 减轻数据库的负担.
这对运算码 (OPcode)的缓存也很有用, 使得脚本不必为每个请求重新编译.
来源: http://www.jianshu.com/p/2140468c6666