分析PHP脚本最简单的方法是什么?
我喜欢在上面添加一些东西,告诉我所有函数调用的转储以及它们花了多长时间,但我也可以在特定的函数周围放一些东西。
我尝试了微时间功能:
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
但这有时会给我带来负面结果。另外,在我的代码中散布这些代码会带来很多麻烦。
分析PHP脚本最简单的方法是什么?
我喜欢在上面添加一些东西,告诉我所有函数调用的转储以及它们花了多长时间,但我也可以在特定的函数周围放一些东西。
我尝试了微时间功能:
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
但这有时会给我带来负面结果。另外,在我的代码中散布这些代码会带来很多麻烦。
当前回答
你们都应该检查一下这个新的php分析器。
https://github.com/NoiseByNorthwest/php-spx
它重新定义了php分析器收集和显示结果的方式。 PHP-SPX不只是输出特定函数调用的总数和执行它所花费的总时间,而是以一种完全可读的方式显示了请求执行的整个时间轴。下图是它提供的GUI界面。
其他回答
交叉张贴我的参考从SO文档测试版下线。
使用XDebug进行分析
可以使用一个名为Xdebug的PHP扩展来帮助分析PHP应用程序以及运行时调试。当运行剖析器时,输出被写入一个名为“cachegrind”的二进制格式的文件。每个平台上都有应用程序来分析这些文件。执行此分析不需要更改应用程序代码。
要启用分析,请安装扩展并调整php.ini设置。一些Linux发行版带有标准包(例如Ubuntu的php-xdebug包)。在我们的示例中,我们将根据请求参数可选地运行概要文件。这允许我们保持设置静态,只在需要时打开分析器。
# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
接下来,使用web客户端向你想要分析的应用程序的URL发出请求。
http://example.com/article/1?XDEBUG_PROFILE=1
在处理页面时,它将写入名称类似于的文件
/tmp/cachegrind.out.12345
默认情况下,文件名中的数字是写入它的进程id。这可以通过xdebug进行配置。profiler_output_name设置。
注意,它将为执行的每个PHP请求/进程编写一个文件。因此,例如,如果您希望分析一个表单帖子,那么将为GET请求编写一个概要文件来显示HTML表单。XDEBUG_PROFILE参数需要传递到后续的POST请求中,以分析处理表单的第二个请求。因此,在分析表单时,有时使用curl直接POST表单会更容易一些。
分析输出
一旦写入配置文件缓存,就可以由KCachegrind或Webgrind等应用程序读取。PHPStorm是一种流行的PHP IDE,也可以显示这种分析数据。
例如,KCachegrind将显示以下信息:
函数执行 调用时间,包括本身和后续函数调用 每个函数被调用的次数 调用图 源代码链接
注意什么
显然,性能调优非常特定于每个应用程序的用例。一般来说,最好是寻找:
重复调用您不希望看到的同一个函数。对于处理和查询数据的函数,这些可能是应用程序缓存的主要机会。 缓慢运行功能。应用程序将大部分时间花费在哪里?性能调优的最佳回报是关注应用程序中消耗时间最多的部分。
注意:Xdebug,特别是它的分析特性,是非常消耗资源的,会降低PHP的执行速度。建议不要在生产服务器环境中运行这些命令。
XDebug并不稳定,而且并不总是适用于特定的php版本。例如,在一些服务器上,我仍然运行php-5.1.6,这是RedHat RHEL5附带的(顺便说一下,所有重要问题仍然会收到更新),而且最近的XDebug甚至不使用这个php编译。所以我最终切换到DBG调试器 它的php基准测试为函数、方法、模块甚至行提供了计时。
PECL XHPROF看起来也很有趣。它有可点击的HTML界面,用于查看报告和相当简单的文档。不过我还没有测试过。
我喜欢使用phpDebug进行分析。 http://phpdebug.sourceforge.net/www/index.html
它输出使用的任何SQL以及所有包含的文件的所有时间/内存使用情况。显然,它在抽象的代码上工作得最好。
对于函数和类分析,我只使用microtime() + get_memory_usage() + get_peak_memory_usage()。
我会大胆地尝试一下BlackFire。
这是我用puphpet把这个virtualBox放在一起,用来测试不同的php框架,如果需要,请随意分叉和/或分发:)
https://github.com/webit4me/PHPFrameworks