PHP程序优化

 PHP程序优化

        Php程序优化的内容比较多,下面重点介绍PHP代码优化、Session机制优化、使用缓存中间件以及PHP代码缓存系统(主要是APC加速)几个部分。

       优化PHP代码

        只有在掌握足够多的技巧之后,我们才能对PHP代码经行优化。当程序编码工作完成之后,我们通常会让一些比较资深的程序员来对代码进行审查,评估程序的质量并找出需要优化的点,这个过程也叫做 Code Review。下面我们来介绍一些比较常见的PHP编程技巧,以及 Code Review 过程中可能涉及到的一些优化原则。

        1、升级到最新的PHP版本

        要知道,编程语言本身也是不断发展的,新版的语言通常会包含语言自身的漏洞修补和性能优化。因此作为专业人士,我们需要定期关注新版本的出现,对于PHP来说,我们可以从官网 http://php.net/上获取到所需信息。

        2、减少include 和 require

        虽然PHP本身已经对这个问题做过一定的优化,但是在大量使用情况下有可能会造成性能的下降。这个过程可以采用安装APC加速器组件的方法来缓解。

        3、使用局部变量代替全局变量

        局部变量的速度是最快的,特别是在一些循环逻辑中,我们尽可能的使用局部变量来进行运算。至于为什么不用全局变量,一方面是因为运行效率的问题,另一方面则是考虑到全局变量不易于2管理。      

        4、尽量使用静态函数或方法
        如果有可能我们应该尽量把函数或者方法定义成静态的,即加上 static 标记,这样有可能会让程序执行的速度提升好几倍。
        5、释放那些不用的变量或者资源
        不要过分的依赖PHP的内存回收机制,程序中一些用不到的变量或者资源应该及时的释放,我们可以使用 unset 方法,或者直接将其设置为 null。另外,如果遇到其他和组件相关的资源更要特别注意,比如数据库连接。
        6、使用单引号替代双引号来包含字符串
        在PHP中,字符串通常使用单引号来包含,因为使用双引号可能会额外产生字符转义甚至变量解析的逻辑,单引号的执行效率要比双引号高。
        7、使用@符号屏蔽错误会降低脚本运行速度
        为了使用方便,某些程序员喜欢使用@来屏蔽错误信息,但是这种做法会降低脚本的运行速度,不推荐使用。
        8、不要过度使用PHP的 OOP
        为了能更好的管理代码,现在比较大型的PHP程序都更倾向使用面向对象思想(OOP)来构建程序框架,但是由于对象通常比较占用内存,类库太多还有可能产生大量的include 和 require 操作,从而造成额外的开销。因此,我们要根据实际情况合理使用OOP思想。这个问题同样可以使用APC加速组件来缓解。
        9、使用抽象类代替接口
        在PHP中使用接口(inteerface)的成本非常高,编程时尽量避免使用。类似的逻辑封装我们通常可以使用抽象类(abstract class)来代替。
       10、使用正则表达式代价昂贵
        虽然,PHP语言的正则表达式功能非常强大,但我们需要知道它的执行成本同样高昂,在可能的情况下,应该尽量使用PHP的字符处理函数来代替。
        11、尽可能的压缩需要存储的数据
        任何数据的存储都需要占用系统的空间资源,所以在可能的范围内应该尽量对数据经行压缩,从而节省系统的空间资源。比如,我们保存IP地址时可以使用ip2long函数把IP地址转化为整型数据来存储,然后再通过long2ip函数还原。另外,对一些大数据还可以使用gzcompress 和 gzuncompress 进行压缩和解压。
        12、使用更高效的语句
         PHP编程语句的效率也有高低之分,下面我们对其比较重要的语句进行对比,以后大家在写代码时需要注意。
  • 分支语句中 switch...case 的效率高于 if...elseif...else
  • 循环语句中 foreach 的效率最高,for 其次,while 最低
  • 叠加语句语句中 ++$i(前缀) 的写法快于 $i++(后缀)
        13、使用更高效的函数
         PHP的函数库非常丰富,相同的功能可以使用不同的函数来完成。不过,不同函数的运行效率也有不同,我们在使用是需要注意,下面我们对一些常用函数进行对比。
  • 字符打印函数 echo 快于 print
  • 字符替换函数 strtr 效率最高,str_replace 其次,prea_replace 正则替换最低
  • 数组查询函数 array_key_exists 最快,inset  其次,in_array 最低
  • 获取远程网络文件 cUrl 效率和可操作性、灵活性最高,fsockopen 次之,file_get_contents 和 fopen 最低
      虽然,对于某些逻辑不是很复杂的程序来说,也许每次代码优化的效果并不是非常明显,但是养成良好的编程习惯是非常重要的,这也是普通程序员和高级程序员之间的差别。上面所列并非所有的PHP编程技巧,况且要掌握这些技巧也不是一朝一夕所能完成的;所谓学海无涯,只有在学习和动手的过程中不断总结积累,才能让自己的编程能力更上一层楼。

      PHP优化Session机制

      简单来说,Session就像每个用户自带的全局变量,用于保存用户在在服务端需要保存的任何信息。实际上,Session会话的功能都可以在系统配置文件php.ini中设置,当然我们也可以使用 ini_set 函数(ini_get 获取配置)从程序上进行设置。
      一般不建议启用auto_start(session.auto_start:是否自动启用) ,因为创建Session需要消耗系统资源,我们通常只会在需要用到Sesson时,才会使用session_start函数来开启Session功能。其次,Session的有效期需要根据系统的情况而定。如果太长,有可能导致会话数据太多造成负载问题;而加入太短,也有可能由于会话创建过于频繁而出现性能问题。系统默认的有效时间为1440秒,也就是24分钟,在实际项目中我们通常会将这个时间设置在1-8小时之间。此外还需注意的是,PHP Session 使用的默认存储方式是文件存储,在php.ini中我们可以通过session.save_handle选线来选择需要的存储方式,但是使用文件存储方式的效率比较低,也不利于系统架构扩展,在实际项目中经常通过session_set_save_handler方法来设置Session回调接口,用于控制Session会话的逻辑,常见的存储介质有数据库、分布式缓存服务器等。
       PHP Session 的优化思路。首先,每次创建Session时都会产生资源消耗,千万不要想当然在全局配置文件中使用session_start 方法。其次,每次会话请求都需要确保带上Session ID,因为服务端获取不到Session ID的话,将会重新创建一个。另外,选择存储方式时,尽量使用快速的存储介质,比如高速缓存服务器Memcache(d)、Redis等。

       使用缓存中间件

       缓存中间件的出现,是为了把查询到的信息缓存在服务器内存中,来替代数据库处理大部分的查询要求,从而减轻数据的压力。目前业内比较常用的缓存中间件为 Memcache 和 Redis(两者的环境搭建和用法以及区别,读者请查找网络资源,此处不做详细介绍) 。根据实际项目中使用的效果,缓存中间件通常能极大提高服务端的查询速度。另外,Redis缓存还可作为写入队列来使用,即先把数据写入到Redis缓存中,然后再转存到数据中去。

       使用APC加速

        随着网络应用的不断发展,逻辑代码也变得越来越复杂,并且框架中引入庞大类库代码的资源消耗也比较高,因此在上线时,我们还需要使用一些代码级别的缓存来加速代码的执行。
        APC(Alternative PHP Cache,PHP代码缓存系统)是非常好的PHP代码缓存解决方案,通过缓存和优化PHP中间码(opcode)来提高PHP的执行效率。
        注:与 APC 同级别的免费的 PHP代码缓存技术还有 eAccelerator 和 XCache( 安装及区别:http://blog.csdn.net/mossader/article/details/6343354)

       优化数据传输

          1、优化json协议
        在通信协议的通用设计原则中,通用性和间接性是最重要的。选择JSON协议作为程序应用协议的基础本身就是对系统的一种优化。
          2、使用gzip压缩
        数据从服务端到客户端的过程需要通过复杂的网络,因此影响网络传输的主要因素有两个,其一网络质量,其二数据本身的大小。对于HTTP协议来说,gzip是目前的主流压缩算法之一,大部分的HTTP服务器都支持这种压缩算法(关于Apache、Nginx 配置gzip压缩功能模块,请 自行查找网络资源)        




       未完待续……
       注:本文摘录自《Android 和 PHP 开发最佳实践》第九章:服务端优化(有删改)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值