面向对象编程越来越流行了,在PHP领域也不例外。所以你选择了合适的设计模式,在最新的framework上开发你的网站,抽象你的数据库访问以至于你都忘了SQL这种东西了。
接下来是什么呢?
当你开始转向面向对象编程时,扑面而来的是令人头疼的访问路径问题(在你使用的framework和你写的代码之间)。
然后你会发现你的网站并没有变快-实际上,它更可能变得更慢。面向对象编程的主要目的是改进代码质量、可维护性和重用性,但是有时候随之而来的代价是速度的变慢。
当我们存在一些潜在的执行缓慢的代码时,我们不再能够打开我们的简单的PHP文件,从上到下的跟踪它的执行。我们怎么才能知道背后到底在怎么运行呢?
Xdebug
Xdebug 2 (当前还是 beta—我在用 2.0.0RC3) 是一个独立的 PHP extension。它为在测试环境中调试和分析代码提供了多种方法。这里,我们关心的是PHP脚本的概要分析(profiling)信息。
在你的apache/php开发环境上安装Xdebug已经超出了我们文章的范围。但是我只是简单的用’sudo pecl install xdebug-beta’,然后在php.ini中添加一行代码就在我的Ubuntu 6.10 虚拟机上安装好了它。
一旦你安装好Xdebug2,下边的代码将为所以PHP接管的请求开启“auto profiling”功能。
- php_value xdebug.profiler_output_dir /tmp
- php_value xdebug.profiler_output_name timestamp
- php_value xdebug.profiler_enable 1
现在打开出现在/tmp目录下的输出文件…
WinCacheGrind
WinCacheGrind是从输出文件获取有用信息最简单的办法。它提供一个简单的树图展示了PHP执行中用到的class、function和filenames。最终要的是,它能告诉你每个function执行的时间。
WinCacheGrind example
(easy注:关于如何使用wincachegrind来进行代码优化,可以参见我前段时间写的《使用Xdebug优化你的程序》)
KCachegrind
如果你在运行KDE(在linux上或者通过fink在Mac OS X上,如果你敢的话),你可能愿意试一试 KCachegrind。它比WinCacheGrind复杂很多,但是它会把数据以一些非常有趣的方式呈现给你。
在这个例子中,callmap 视图非常清晰的显示了通过mysql_query()执行的sql查询花费了最多的时间。
Xdebug call map example
这里我们看见了部分的callgraph,显示了函数的交互。
(easy注:强烈推荐Rasmus Lerdorf的《Getting Rich with PHP5》,一个使用KCachegrind进行优化的经典实例)
减少摩擦(原文:Grinding),增加cache
想知道加速你的代码最简单的办法?答案有三,Cache、Cache还是Cache。
用你的新工具找出你代码中比较慢的地方。确定慢查询已经用上了Mysql的Cahe。试试APC之类的PHP二进制码存储。用Memcahed缓存你的PHP对象。缓存你生成代码的HTML中常见的部分。在发送页面前缓冲整个页面。用 Expires, ETag 和 Last-Modified HTTP headers让用户缓冲你的页面。cache层越多越好。
More Xdebug
xdebug远不止输出概要分析-我把它看成后端开发者的Firebug。我推荐每一个从事PHP相关开发的人在他们的测试环境下装xdebug,即使只是为了能输出彩色的全栈跟踪的PHP错误信息。
从Google Summer of Code Project来看,支持即时交互的Xdebug很快就会可用了~