php性能调试技术(详解PHP程序开发过程中的性能优化)PHP函数 / PHP函数性能调优技巧...

wufei123 发布于 2024-05-28 阅读(17)

详解PHP程序开发过程中的性能优化使用PHP的最大1个优势就是速度快一般情况下,PHP总是具有足够的速度支持Web内容动态生成,许多时候甚至无法找出比它更快的方法然而,当面对庞大的访问量、高负荷的应用、有限的带宽,以及其他各种带来性能瓶颈的因素时,就需要考虑怎样提高PHP的性能了。

一、代码优化代码优化不仅仅是写出干净和清晰的代码,而是对代码进行一定的简化可以使用Zend Optimizer来自动帮助完成这些繁杂的工作Zend Optimizer可以从Zend Technologies的网站。

php性能调试技术(详解PHP程序开发过程中的性能优化)PHP函数 / PHP函数性能调优技巧...

http://www.zend.com/http://www.189works.com免费得到,但必须同意它的许可约定,因为它不是以GPL方式发行的它的原理很简单,即通过检测Zend引擎产生的中间代码,并对它进行优化,从而获得更高的执行速度。

在使用了Zend Optimizer后,复杂的PHP源程序的执行效率马上会得到显著提高,缺点是优化后的代码可读性下降,给代码修改带来困难Zend Optimizer的安装方法非常简单,只要根据用户使用的平台,下载相关的预编译版本,把下面2行代码加入到php.ini文件中,重新启动Web 服务器就行了:。

zend_optimizer.optimization_level=15zend_extension=″/path/to/ZendOptimizer.so″zend_loader.enable=Off额外增加的第三行代码是可选的,因为禁用zend_loader将会使优化速度更快。

需要注意的是,只有在不使用Zend Encoder Runtime的时候,才可以禁用zend_loader PHP优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码给大家提供下面这些优化技巧:。

1. echo 比 print 快2. 使用echo的多重参数代替字符串连接3. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替4. 对global变量,应该用完就unset()掉。

5. 用单引号代替双引号来包含字符串,这样做会更快一些因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会6. 函数代替正则表达式完成相同功能7. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。

这种差异是PHP特有的,并不适用于其他语言,++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令后置递增实际上会产生一个临时变量,这个临时变量随后被递增而前置递增直接在原值上递增。

8. 使用选择分支语句(switch case)好于使用多个if,else if语句9. 利用var_dump进行PHP代码调试如果你在寻找php调试技术,我必须说var_dump应该是你要找的目标,在显示php信息方面这个命令可以满足你的所有需要,而调试代码的多数情况与得到PHP中的数值有关。

10. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少11. 动辄创建全局数值是一种糟糕的做法,不过有时候实际情况的确又需要这么做对于数据库表或数据库连接信息使用全局数值是一个不错的想法,但不要在你的PHP代码中频繁使用全局数值。

另外,更好的一种做法是把你的全局变量存放在一个config.php文件中12. 如果你想知道脚本开始执行的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()13. 打开apache的mod_deflate模块。

14. 用@屏蔽错误消息的做法非常低效15. 尽量采用大量的PHP内置函数16. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍17. 派生类中的方法运行起来要快于在基类中定义的同样的方法。

18. 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)19. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍尽量多用静态HTML页面,少用脚本。

20. 正如之前提到的,任何php网站中最重要的部分有99%的可能是数据库因此,你需要非常熟悉如何正确的使用sql,学会关联表和更多高级的数据库技术21. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。

22. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数此函数执行起来相当快,因为它不做任何计算,只返回zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。

23. 并不是所有情况都必须使用面向对象开发,面向对象往往开销很大,每个方法和对象调用都会消耗很多内存24. 除非脚本可以缓存,否则每次调用时都会重新编译一次引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

欢迎加小编好友互相交流,或者搜索微三云麦超二、使用缓存如果PHP程序的规模很大,那么提高速度的办法就是使用缓存现在已经有许多缓存方案可供选择,其中包括Zend Cache、APC和Afterburner Cache。

上面这几种都是“缓存模块”(caching modules)第一次调用PHP文件时,缓存模块从PHP源代码生成一些中间代码,并把这些中间代码存储在Web服务器的内存中以后再调用这些文件时,就可以直接使用内存中“编译”过的代码。

这种方法确实能够改善应用的性能,因为它使得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行,使得服务器响应请求的速度大大提高当然,缓存模块还会监视PHP源文件的变化,必要时会重新缓存页面,从而防止用户得到的页面仍旧由过时的PHP代码生成。

由于缓存模块能够明显地降低服务器的负载,提高PHP应用的响应效率,因此它们非常适合于负载较大的网站使用Zend Cache是Zend Technologies公司开发的商业软件在第一次运行后,PHP页面的运行速度立刻会有很大的提高,服务器的空闲资源也更多了。

缺点是它不是免费的,但性价比还是很高的Afterburner Cache是Bware Technologies公司开发的免费缓存模块功能与Zend Cache基本一样,但提高性能方面比不上Zend Cache。

APC(Alternative PHP Cache)是由Community Connect公司开发的另一种免费缓存模块,可以从http://pecl.php.net/package/APC获得对于产品应用来说,它的性能很稳定,而且也能在很大程度上提高响应请求的速度。

缓存技术  下面来说说常用的缓存技术,通过这些缓存技术能够大大的提高效率  在说到缓存技术的时候不得不提到memcached ,memcached是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。

  Memcached的原理  memcached 是以守护程序方式运行于一个或多个服务器中,等待接收客户端的连接操作,客户端可以由各种语言编写(例如PHP)PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。

  说完memcached,下面来说说常用的缓存方法  1、编译与OPCODE缓存  因为PHP是解释型的语言,所以每个PHP文件在运行的时候都需要编译后再执行,同一个文件,不同的用户访问,或者同一个用户不同时间访问同一个文件,每次都需要重新编译然后运行,这样就耗费了大量时间。

  通过编译缓存每个文件在修改之后只编译一次这样就减少了文件IO操作,用户访问后机器指令直接从内存中取出并执行而不是硬盘中读出  最常见的PHP编译缓存工具有:APC,Accelerator,xcache。

  2、全局页面缓存-- Squid Cache  Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器,Squid作为网页服务器的前置cache服务器通过缓存相关请求来提高Web服务器的速度。

  3、局部缓存之SQL缓存  在大多数应用程序中主要的瓶颈往往可以追溯到数据库的操作中,一般都是因为复杂的数据库查询而耗费了大量时间,而SQL缓存可以大大降低复杂查询造成的负荷  SQL缓存的例子(使用了memcached扩展)。

  代码片段:  $key = md5(“some sort of sql query”);  if (!($result = memcache_get($key))) {  $result = $pdo->query($qry)->fetchAll();

  // 缓存查询结果一小时  memcache_set($key, $result, NULL, 3600);  }  4、局部缓存之代码块缓存  为了优化PHP程序,有时候我们不得不优化一个个代码段来减少那么一点点的执行的时间,但是比起优化复杂的不同的PHP代码段还不如通过缓存来直接忽略这些代码段的优化,这样做的好处是:

  1、能够很快的看到效果  2、不会破坏以前的代码  3、速度要比优化代码要快得多  代码块缓存的列子(同样使用了memcached扩展)  代码片段:  function complex_function_abc($a, $b, $c) {

  $key = __FUNCTION__ . serialize  (func_get_args());  if (!($result = memcache_get($key))) {  $result = //函数代码

  // 储存执行结果1小时  memcache_set($key, $result, NULL, 3600);  }  return $result;  }三、压缩网页内容影响站点的访问速度还有1个重要因素,那就是下载速度。

解决的办法就是压缩网页内容对于纯文本内容而言,HTTP压缩技术可压缩至原大小的40%以下,从而提供60%以上的数据传输节约虽然Web服务器会因为压缩导致CPU占用的略微上升,但可以节约大量用于传输的网络IO。

根据IETF规范,大部分浏览器都支持使用gzip压缩算法进行内容压缩也就是说,可以先用gzip压缩网页内容,然后发送到客户端浏览器,浏览器在接收的时候会自动解压数据,再显示页面这个过程对用户来说,是完全透明的。

同样,压缩Web页面的内容也有不同的方法Mod_gzip是1种开放源代码的、标准的Apache模块,也叫互联网内容加速模块可以将它和Apache一起编译,也可以作为DSO使用相对于普通的浏览过程,它可以节省40%左右的流量。

Mod_gzip不仅可以压缩静态的内容,如HTML、XML,而且对动态生成的,包括SQL、Java、WML、VRML等产生的内容,在服务器端进行实时压缩并传输,其压缩效率惊人,一般都为60%~85%压缩动态网页的内容,还可以使用class.gzip来对.php文件编码,class.gzip通过在PHP脚本的开头和结尾调用它的一些函数来压缩网页内容。

如果整个站点都需要这样的压缩,可以在php.ini文件中的auto_prepend和auto_append中调用这些函数,但是会占用一定的系统开销PHP4.0.4推出了1种新的输出缓冲的处理手段—ob_gzhandler,它的作用和class.gzip完全一样,区别是可以直接把它加到php.ini 文件中,语法如下:

output_handler = ob_gzhandler;这样将激活PHP的输出缓冲功能,并在发送内容前进行压缩如果不想在这里设置,只在需要的地方才改变这个默认设置(不压缩),只要在需要压缩的PHP源程序目录中,修改一下.htaccess文件就行了,语法如下:。

http://www.189works.comphp_value output_handler ob_gzhandler或者直接在PHP代码中调用它:ob_start("ob_gzhandler");输出缓冲的效果确实很理想,并且不会为服务器带来额外的系统开销。

要注意的一点是Netscape Communicator不支持图像的压缩因此除非知道访问者都使用Internet Explorer,否则必须禁止压缩jpeg和gif图象有些童鞋不推荐压缩HTML,主要原因除了上面所说的使用PHP压缩HTML注意事项外,通过gzip压缩已经能达到很好的效果。

另外,因为产生影响HTML的角色太多(静态,动态,前端动态),也没什么量化指标,所以很难控制压缩成什么样(代码写成什么程度)代码更需要考虑执行效率,而不是传输效率对于动态页面来说,HTML的压缩有可能还会增加服务器的CPU负担,得不偿失。

Google的压缩网页是因为早期他希望首页文本尽可能控制在一个或两个包内,而且他的首页太重要了,流量也很离谱压缩一个字节,总流量一算都是个不小的数字,自然也就是必要之举了进一步的压缩存在问题,除非能像Google一样充分测试(Google也仅压缩了少部分核心服务的页面),否则不推荐对HTML进行压缩处理。

但使用情留メ蚊子的PHP压缩HTML代码,能很好的解决这个问题四 其它技巧在编程时,使用一些小技巧也可以加快PHP的运行速度:(1)用i+=1代替i=i+1,既符合c/c++的习惯,效率相对还更高(2)尽可能使用PHP内部函数。

(3)能使用单引号字符串时,尽量使用单引号字符串单引号字符串的效率要高于双引号字符串(4)用foreach代替while遍历数组,foreach的效率明显高于while循环,而且不需要调用reset函数。

欢迎加小编好友互相交流,或者搜索微三云麦超

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻98793