PHP
性能优化:
整体介绍:
1、规范说明
性能是网站运行是否良好的关键因素,
网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是咱们每一个开发人员必备的素质,
也是咱们良好的职业素养。
2、影响性能的因素
A
、
商业需求
1.
需求合理性
2.
需求与系统的整合
3.
需求所带来的商业利益是否与需求开发的成本成正比
4.
需求所带来的风险
B
、 Web
服务器
1.
并发处理能力
2.
高负载的能力
3.
负载均衡的能力
4.
动态内容与静态内容的处理能力
5. Web
服务器部署
C
、DataBase
服务器
1.
并发访问
2.
数据库服务器的部署
3.
数据库的 shema
架构与的表设计是否合理
4.
数据检索
D
、
操做系统
E
、
客户端请求
F
、
程序/
语言
3、分析性能的指标
1.
程序的运行时间microtime()
2.
程序的运行所消耗的内存memory_get_usage()
3.
单位时间内的并行处理
4.
磁盘 IO
的处理
4、优化性能的目标
快速、并发、资源消耗低(内存、磁盘 IO
、CPU
负载)
5、优化性能的原则
1.
服务器配配置最优化
2.
服务器部署合理化
3.
商业需求合理并与产出的商业价值成正比
4.
架构可用、可维护、可扩展
5.
程序的正确性、简单性、逻辑的合理性。
6.
不断的分析性能的的瓶颈
7.
不断的重构已有的代码
8.
优化的优先级:program->database->web sersver->os->client
代码优化:
(1
)链接字符使用 ,
代替 . echo ‘string1’,$a,’string2’,$b;
(2
)循环以前先取出最大值,而不是在循环里面取值
$max = count($array);
for ($i=0;$i<$max;$i++) {
echo $i;
}
(3
)使用 static
静态方法比普通方法快4
倍,static
表示的属性只初始化一次 DataInterface::getUserIds($uid);
(4
)
在PHP
中的执行速率从快到慢为:echo(), print(), print_r()
,
echo
是PHP语句, print和print_r是函数,语句没有返回值,函数能够有返回值(即使没有用)
(5
)使用unset
释放给定的变量
(6
)includes
和requires
包含文件使用完整路径
(7
)使用strncasecmp, strpbrk
和 stripos
代替 regex
(8
)使用switch
代替if else
语句
(9
)抑制错误符@
性能很低,
报错函数
(10
)任什么时候间记住关闭不须要的数据库链接
(11
)$row['id']
比 $row[id]
性能快7
倍
(12
)增长一个全局变量比增长一个局部变量慢2
倍
(13
)使用单引号而不是双引号引用字符
(14
)使用HTML
比PHP
脚本快2-20
倍
(15
)使用PHP
缓存可加速性能25%-100%
(16
)$++
比++$i
慢
(17
)不要过分使用OOP
,适度而止
(18
)尽可能使用PHP
内置函数
·
变量
1
、
变量长度小,
注意变量大小是节约内存的最有效手段,对于来自用户表单、数据库和文件缓存的数据都须要控制变量的大小。
由于cpu
要处理的数据是来源于内存,名字越长查询所须要的时间就越多
2
、unset()
函数注销不须要的变量是一种良好的习惯,将一些不须要的变量当即注销可提升内存的使用率。
3
、
尽可能不要复制变量,不然就会带来1
倍的内存消耗,即便复制变量也应该要当即注销原有变量。
4
、
变量类型,
初始化变量请注意其变量类型,一个变量在执行过程当中最好只有一种类型状态。对于数组变量,请初始化声明,以下: $a = array();
5
、
临时变量,
是处理业务逻辑的临时存储,这些都是须要消耗内存的。若是临时变量使用结束请当即注销,特别是在一些过程式代码的执行流程中,对于一些函数,若是业务很是复杂,一样须要当即注销临时变量
6
、
静态变量,
对于一些须要由复杂业务产生的变量,若是在程序的执行过程当中屡次产生并使用,可考虑使用静态变量,减小程序的cpu
执行次数
7
、
变量的性能:局部变量>
全局变量>
类属性>
未定义的变量。
·
循环
1
、
尽可能减小循环的次数。
2
、
尽可能减小循环的潜逃的层次,不要超过三层。
3
、
避免在循环内有过多的业务逻辑。
4
、
不要循环包含文件
5
、
不要循环执行数据库操做。
6
、
优先使用foreach,
它比for/while
效率高
7
不要把 count/strlen/sizeof
放到 for
循环的条件语句中For($i=0,$count=count($array);$i<$count;$i++){}
不要使用for($i=0;$i<count($array);$i++){};
8
、 for($i=$total;$i>0;$i
–){}
性能好于for($i=0;$i<$total;$
–){}
9
、
保持循环体内的业务逻辑清晰
·
函数
1
、
函数职责清晰,一个函数只干一件事,不要杂揉过多的业务逻辑
2
、
函数代码体不要超过20
行,反之,考虑拆分。
3
、
优先使用php
内置函数,内置函数的参数获取,经过zend_parse_parameters
方法来实现,对于数组、字符串等参数,zend
实现的是浅拷贝,所以这个效率是很高的。能够这样说,对于php
内置函数,其效率和相应c
函数几乎相同,惟一多了一次转发调用。
4
、
常量与函数同时能干一件事,优先使用常量。
· phpversion()< PHP_VERSION
· get_class()< __CLASS__
· is_null()< NULL ===
6
、 $_SERVER[REQUEST_TIME]
替换time();
7
、
字符串替换strtr()->str_replace()->preg_replace()->epreg();
8
、
发挥trim
最大功效,替换substr
。$filepath=trim($filename,
’/
’).
’/
’;
9
、Isset/empty
虽然两个函数功能有所差别,但在一样的状况下推荐使用 empty()
10
、isfile/file_exist
两个函数的功能有所不一样,file_exist
既可判断文件是否存在,也能够判断目录是否存在,在一样的状况下推荐使用is_file
11
、php
中的伪函数
Isset empty unset eval
经过上面的介绍能够看出,伪函数因为被直接翻译成指令来执行,和普通函数相比少了一次函数调用所带来的开销,所以性能会更好一些。
mt_rand
平均速度比 libc
提供的 rand()
快四倍。
·
文件
1
、
减小文件包含数,减小磁盘 IO
2
、
使用完整路径,或者容易转换的相对路径。避免在 include_path
查找
3
、
文件的代码行数不要超过 2000
行
4
、Require_once/include_once
效率低于 require/include,
须要额外的去查看系统是否已经调用过这个文件.
由于它们在一个opcode
缓存下的调用很是慢
5
、程序执行文件用 requie/require_once,
缓存文件用include/include_once
。Include
效率好于 require
6
、优化 spl
中的文件自动加载机制,可参靠yii
7
、类库文件加载,是否考虑类是否已经实例化,可考虑采用设计模式之单例模式
8
、文件读写的并发性
面向对象
1
、
控制实例的建立的数量
2
、
优先使用常量、类常量
3
、
优先例用静态变量,静态属性
4
、
类的结构合理
5
、
面象接口编程
6
、
封装变化点
7
、
依赖于抽象,不依赖于细节
8
、
优先使用静态成员
9
、
类的接口清晰稳定,类的职责单一,类与类的通讯合理
10
、
使用常量的好处
编译时解析,没有额外开销
杂凑表更小,因此内部查找更快
类常量仅存在于特定「命名空间」,因此杂凑名更短
代码更干净,使除错更方便
字符串
1
、
用单引号替代双引号引用字符串;避免检索字符串中的变量
运算
1
、
用 i+=1
代替i=i+1
。符合c/c++
的习惯,效率还高
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
等,适时的清理这些资源
B
、
数据库优化
1
、
合理的商业需情
2
、
数据库 schema
架构优化
3
、
垂直与水平分库分表
4
、
索引优化,查询优化
5
、
第三方开源检索工具(sphinx)
6
、
主从数据库服务器的使用。
C
、 Web
服器优化(暂未整理,
有相应的 Web
服务器优化手册)
D
、
操做系统优化(
暂未整理,
有相应的 OS
优化手册)
E
、
前端优化
1
、合理的 html
结构
2
、合理 html
与css
的同时,考虑 Css
设计合理,减小 http
请求
3
、合理 html
与java script
的同时,考虑拆分是否合理,减小 http
请求
4
、优化 java script
代码,让用户有良好的体验
5
、根据 http
协议,优化高并发请求
1
.
一个功能能够用内置函数完成,尽可能使用它而不是本身编写php
函数。
2
.
若是某个功能对性能要求很高,能够考虑用扩展来实现。
3
. Php
函数调用开销较大,所以不要过度封装。有些功能,若是须要调用的次数不少自己又只用1
、2
行代码就行实现的,建议就不要封装调用了。
4
.
不要过度迷恋各类设计模式,如上一条描述,过度的封装会带来性能的降低。须要考虑二者的权衡。Php
有本身的特色,切不可东施效颦,过度效仿java
的模式。
5
.
函数不宜嵌套过深,递归使用要谨慎。
6
.
伪函数性能很高,同等功能实现下优先考虑。好比用isset
代替array_key_exists
7
.
函数返回引用没有太大意义,也起不到实际做用,建议不予考虑。
8
.
类成员方法效率不比普通函数低,所以不用担忧性能损耗。建议多考虑静态方法,可读性及安全性都更好。
9
.
如不是特殊须要,参数传递都建议使用传值而不是传引用。固然,若是参数是很大的数组且须要修改时能够考虑引用传递。
|