您的位置:首页 > 编程语言 > PHP开发

PHP性能优化

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