PHP性能优化

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 如不是特殊须要,参数传递都建议使用传值而不是传引用。固然,若是参数是很大的数组且须要修改时能够考虑引用传递。
相关文章
相关标签/搜索