“为 PHP 应用提速、提速、再提速!” 系列文章
![](/icons/6926de.gif)
第 1 部分 演示了如何使用 XCache(PHP 操作码缓存Cache) 加速整个站点
![](/icons/6926dou2.gif)
XCache(仅是少数几种缓存Cache包中
![](/icons/6926de.gif)
![](/icons/6926yi.gif)
种)保留了编译过程
![](/icons/6926de.gif)
输出
![](/icons/6926dou.gif)
去掉了其他冗余
![](/icons/6926de.gif)
工作
![](/icons/6926dou2.gif)
只要页面没有发生变化
![](/icons/6926dou.gif)
缓存Cache后
![](/icons/6926de.gif)
页面就能够胜任代理
![](/icons/6926de.gif)
作用
![](/icons/6926dou2.gif)
当页面发生变化时
![](/icons/6926dou.gif)
缓存Cache后
![](/icons/6926de.gif)
页面就会变为无效并被替换掉
![](/icons/6926dou2.gif)
操作码缓存Cache —— 以及
![](/icons/6926yi.gif)
个操作码优化器
![](/icons/6926dou.gif)
通常由相同
![](/icons/6926de.gif)
包提供 —— 是
![](/icons/6926yi.gif)
种加快站点响应
![](/icons/6926de.gif)
低成本技术
![](/icons/6926dou2.gif)
很多缓存Cache包是免费
![](/icons/6926de.gif)
![](/icons/6926dou.gif)
并且是开源
![](/icons/6926de.gif)
![](/icons/6926dou.gif)
无需改变任何代码即可从中受益
![](/icons/6926dou2.gif)
当然
![](/icons/6926dou.gif)
在某些应用
![](/icons/6926chengxu.gif)
中
![](/icons/6926dou.gif)
相比较实际
![](/icons/6926de.gif)
执行时间
![](/icons/6926dou.gif)
将 PHP 源代码文件翻译为其相应
![](/icons/6926de.gif)
操作码所需
![](/icons/6926de.gif)
时间微不足道
![](/icons/6926dou2.gif)
连接到远程数据库服务器
![](/icons/6926dou.gif)
使用低效
![](/icons/6926de.gif)
SQL 语句进行查询
![](/icons/6926dou.gif)
以及其他大量解析和操作数据
![](/icons/6926de.gif)
工作都非常
![](/icons/6926de.gif)
繁琐
![](/icons/6926dou.gif)
也因此增加了开销
![](/icons/6926dou.gif)
甚至产生浪费
![](/icons/6926dou2.gif)
良好
![](/icons/6926de.gif)
网络设计和灵巧
![](/icons/6926de.gif)
数据库结构可以使时间冗长和查询缓慢
![](/icons/6926de.gif)
情况有所改善
![](/icons/6926dou.gif)
如果需要
![](/icons/6926de.gif)
话还可以向友好
![](/icons/6926de.gif)
专家请求帮助
![](/icons/6926dou2.gif)
但是
![](/icons/6926dou.gif)
如果代码运行缓慢
![](/icons/6926dou.gif)
您可能更希望自己处理
![](/icons/6926dou2.gif)
但是从何开始呢?正如人们普遍认为
![](/icons/6926de.gif)
![](/icons/6926dou.gif)
在代码完成前调试代码
![](/icons/6926de.gif)
做法很不明智 ——
![](/icons/6926yinwei.gif)
代码
![](/icons/6926de.gif)
首次实现可能会非常
![](/icons/6926de.gif)
迅速
![](/icons/6926dou2.gif)
当代码正确且能实现相应
![](/icons/6926de.gif)
功能时
![](/icons/6926dou.gif)
不管其表面上看起来运行缓慢还是实际如此
![](/icons/6926dou.gif)
首先要做
![](/icons/6926de.gif)
就是对其性能进行测试或基准测试
![](/icons/6926dou2.gif)
不执行这样
![](/icons/6926de.gif)
诊断而尝试去优化代码无疑是在黑暗中摸索
![](/icons/6926yi.gif)
个简单
![](/icons/6926de.gif)
性能指标是挂钟时间(wall clock time)
![](/icons/6926dou.gif)
或测量页面请求和完成呈现的间
![](/icons/6926de.gif)
实际延迟
![](/icons/6926dou2.gif)
对于某些情况 —— 比如在您自己
![](/icons/6926de.gif)
工作站本地运行
![](/icons/6926de.gif)
Web 服务器、数据库和浏览器 —— 挂钟时间能够提供信息
![](/icons/6926dou2.gif)
然而
![](/icons/6926dou.gif)
挂钟时间对于其他大多数情况而言并无实际意义
![](/icons/6926dou.gif)
比如网络延迟时间、活动
![](/icons/6926de.gif)
Web 服务器或者活动
![](/icons/6926de.gif)
数据库
![](/icons/6926yi.gif)
种更精确
![](/icons/6926de.gif)
测量 —— 甚至可以测量运行单个源代码语句
![](/icons/6926de.gif)
时间 —— 可以采用代码分析器
![](/icons/6926dou2.gif)
分析器通常被实现为 PHP 运行时引擎
![](/icons/6926de.gif)
扩展
![](/icons/6926dou.gif)
记录语句开始和结束
![](/icons/6926de.gif)
delta、记录
![](/icons/6926chengxu.gif)
开始和结束的间
![](/icons/6926de.gif)
delta 并捕获对来到
![](/icons/6926de.gif)
请求形成响应
![](/icons/6926de.gif)
总时间
![](/icons/6926dou2.gif)
有了这种垂直度
![](/icons/6926dou.gif)
就可以将语句、循环、
![](/icons/6926hanshu.gif)
、类或者是运行缓慢
![](/icons/6926de.gif)
库作为分析目标
![](/icons/6926dou2.gif)
如果不是时间而是内存使用出现了问题
![](/icons/6926dou.gif)
那么
![](/icons/6926yi.gif)
个优秀
![](/icons/6926de.gif)
分析器还可以显示组件
![](/icons/6926de.gif)
内存占用情况
PHP
![](/icons/6926de.gif)
![](/icons/6926yi.gif)
个较流行
![](/icons/6926de.gif)
分析器是 Xdebug
![](/icons/6926dou.gif)
它还为交互地调试 PHP 应用
![](/icons/6926chengxu.gif)
提供了服务器挂钩(hook)
![](/icons/6926dou2.gif)
(参见“调试
![](/icons/6926de.gif)
更好思路方法”以了解更多信息
![](/icons/6926dou2.gif)
该系列
![](/icons/6926de.gif)
另
![](/icons/6926yi.gif)
部分将探讨高级交互式调试
![](/icons/6926dou2.gif)
) Xdebug 很容易从源代码构建
![](/icons/6926dou.gif)
将其作为 Zend 扩展进行安装也非常简单
![](/icons/6926dou2.gif)
(现在已有针对某些平台
![](/icons/6926de.gif)
2进制文件
![](/icons/6926dou2.gif)
)当就绪后
![](/icons/6926dou.gif)
对基于 PHP 页面
![](/icons/6926de.gif)
每个请求都将生成可在 KCacheGrind 中查看
![](/icons/6926de.gif)
数据集
![](/icons/6926dou2.gif)
构建并安装 Xdebug
如果具备了 PHP 实用工具 phpize 和 php-config
![](/icons/6926dou.gif)
而且具有对系统
![](/icons/6926de.gif)
php.ini 配置文件
![](/icons/6926de.gif)
访问权
![](/icons/6926dou.gif)
那么安装和设置 Xdebug 只需几分钟
![](/icons/6926de.gif)
时间
![](/icons/6926dou2.gif)
下面给出
![](/icons/6926de.gif)
指导介绍说明针对 Linux®
![](/icons/6926dou.gif)
不过在 Mac OS X 上
![](/icons/6926de.gif)
安装步骤实际上和此类似
![](/icons/6926dou2.gif)
(您可以从 Xdebug Web 站点找到针对 Microsoft® Windows®
![](/icons/6926de.gif)
Xdebug 预编译版本
![](/icons/6926dou2.gif)
)
Xdebug
![](/icons/6926de.gif)
最新版本为 V2.0.0RC3(最终版本 V2.0.0 在您阅读此文时也许已经可用)
![](/icons/6926dou2.gif)
下载并解包 tarball
![](/icons/6926dou.gif)
然后切换到源代码
![](/icons/6926de.gif)
子目录
![](/icons/6926dou2.gif)
确保 phpize 和 php-config 位于 shell
![](/icons/6926de.gif)
PATH
![](/icons/6926dou.gif)
准备使用 phpize 进行构建
清单 1. 设置 Xdebug
$ wget http://www.xdebug.org/files/xdebug-2.0.0RC3.tgz
$ tar xzf xdebug-2.0.0RC3.tgz
$ cd xdebug-2.0.0RC3/xdebug-2.0.0RC3
$ phpize
Configuring for:
PHP Api Version: 20020918
Zend Module Api No: 20020429
Zend Extension Api No: 20050606
phpize
![](/icons/6926de.gif)
产品是
![](/icons/6926yi.gif)
个脚本 —— 名为配置 —— 它对余下
![](/icons/6926de.gif)
构建过程进行配置
![](/icons/6926dou2.gif)
要构建 Xdebug
![](/icons/6926dou.gif)
在 make 后紧接着输入 ./configure 即可
![](/icons/6926dou2.gif)
清单 2. 构建 Xdebug
$ ./configure
checking build system type... i686-apple-darwin8.8.1
checking host system type... i686-apple-darwin8.8.1
checking for egrep... grep -E
...
$ make
...
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
make 命令生成 Xdebug 扩展
![](/icons/6926dou.gif)
xdebug.so
![](/icons/6926dou2.gif)
剩下
![](/icons/6926de.gif)
工作就是使用 sudo make
![](/icons/6926install.gif)
进行安装
![](/icons/6926dou2.gif)
$ sudo make ![](/icons/6926install.gif)
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20020429/
注: 如果在终端窗口中运行最后
![](/icons/6926yi.gif)
个命令
![](/icons/6926dou.gif)
请选择并复制最后
![](/icons/6926yi.gif)
步中发出
![](/icons/6926de.gif)
目录
![](/icons/6926dou2.gif)
在下
![](/icons/6926yi.gif)
个步骤中将会用到它
![](/icons/6926dou2.gif)
最后
![](/icons/6926dou.gif)
要使配置数据可视化
![](/icons/6926dou.gif)
必须使用 KCacheGrind 和 GraphViz
![](/icons/6926dou2.gif)
包含 K Desktop Environment (KDE)
![](/icons/6926de.gif)
Linux 发行版很可能已经含有了 KCacheGrind 和 GraphViz
![](/icons/6926dou2.gif)
如果没有包含
![](/icons/6926dou.gif)
适合您所使用
![](/icons/6926de.gif)
Linux
![](/icons/6926de.gif)
那些版本也不难找到
![](/icons/6926dou2.gif)
Debian 用户可以使用 Advanced Packaging Tool (APT) 快速安装 KCacheGrind 和 GraphViz 以及所有包
![](/icons/6926de.gif)
依赖关系
![](/icons/6926dou2.gif)
清单 3. 安装 KCacheGrind
$ apt-cache search kcachegrind
valgrind-callgrind - call-graph skin for valgrind
kcachegrind - visualisation tool for valgrind profiling output
kcachegrind-converters - format converters for KCachegrind profiling visualisation tool
$ apt-cache search graphviz
graphviz - rich
of graph drawing tools
graphviz-dev - graphviz Libs and Headers against which to build applications
graphviz-doc - additional documentation for graphviz
libdeps-renderer-dot-perl - DEPS renderer plugin using GraphViz/dot
...
$ sudo apt-get
kcachegrind graphviz
...
如果没有将 KDE 安装到系统中
![](/icons/6926dou.gif)
KCacheGrind、GraphViz 以及所有必要
![](/icons/6926de.gif)
内容将占用大约 90 MB
![](/icons/6926de.gif)
磁盘空间
![](/icons/6926dou2.gif)
配置 Xdebug
安装了 Xdebug 扩展后
![](/icons/6926dou.gif)
就可以准备启用和配置该扩展了
![](/icons/6926dou2.gif)
在文本编辑器中打开 php.ini
![](/icons/6926dou.gif)
并添加以下代码行
清单 4. 启用和配置该扩展
zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so
xdebug.profiler_output_dir = "/tmp/xdebug/"
xdebug.profiler_enable = Off
xdebug.profiler_enable_trigger = 1
第
![](/icons/6926yi.gif)
行 zend_extension 加载 Xdebug 扩展
![](/icons/6926dou2.gif)
第 2行命名放置分析器输出
![](/icons/6926de.gif)
目录
![](/icons/6926dou2.gif)
如果需要
![](/icons/6926de.gif)
话
![](/icons/6926dou.gif)
创建命名
![](/icons/6926de.gif)
目标并更改其模式以允许用户对 Web 服务器进行写访问
![](/icons/6926dou2.gif)
第 3行禁用了分析器
![](/icons/6926dou2.gif)
然而
![](/icons/6926dou.gif)
第 4行将在设置 HTTP GET 或 POST 参数 XDEBUG_PROFILE 时启用分析器
![](/icons/6926dou2.gif)
(如果您希望
![](/icons/6926yi.gif)
直使用分析器
![](/icons/6926dou.gif)
在第 3行代码中将 Off 更改为 _disibledevent="为 PHP 应用提速、提速、再提速!第 2 部分: 分析 PHP 应用
![](/icons/6926chengxu.gif)
以查找、诊断和加速运行缓慢
![](/icons/6926de.gif)
代码" />
找回周期
和其他众多 PHP 扩展
![](/icons/6926yi.gif)
样
![](/icons/6926dou.gif)
Xdebug 容易构建、安装快捷且易于配置 —— 所有这些工作 10 分钟内即可完成
![](/icons/6926dou2.gif)
如果您已经优化了 Apache 安装并且对应用
![](/icons/6926chengxu.gif)
进行了缓存Cache
![](/icons/6926dou.gif)
但是性能仍然很差
![](/icons/6926dou.gif)
那么可以考虑
![](/icons/6926yi.gif)
下代码
![](/icons/6926de.gif)
运行
![](/icons/6926dou2.gif)
算法是否有效?代码是否过于复杂?是否重复实现了 PHP 已提供
![](/icons/6926de.gif)
![](/icons/6926hanshu.gif)
?
当然
![](/icons/6926dou.gif)
如果不能判断出应用
![](/icons/6926chengxu.gif)
![](/icons/6926de.gif)
瓶颈所在
![](/icons/6926dou.gif)
那么就必须进行查找并加以修复
![](/icons/6926dou2.gif)
不要只凭猜测 —— 要进行分析!您可能会惊讶于宝贵
![](/icons/6926de.gif)
计算周期是如何被轻意耗费掉
![](/icons/6926de.gif)
![](/icons/6926dou2.gif)
并且永远不要忘记:要在生产服务器中禁用 Xdebug
![](/icons/6926dou.gif)
![](/icons/6926yinwei.gif)
启用它总会增加系统开销