2

我想在每个文件的开头和结尾自动调用用户定义的函数。这将包括被请求的脚本以及该脚本中的每个包含。

这样做的目的是创建一个调试工具,该工具将记录每个文件执行所需的时间。每个文件开头和结尾的微时间将被存储,以在脚本执行结束时报告结果。

[编辑] 我花了一些时间查看 xhprof 和 xdebug

Xdebug 无法工作,因为我无法在运行时打开和关闭它(我们当前的调试系统允许我们在 URL 中传递一个属性,它将打开/关闭调试作为会话变量,最终在页面底部显示分析数据加载后 - 这非常有用)

Xhprof 更接近,尽管它不允许我分解每个函数调用,也不允许传递附加调试信息以附加到分析元素。例如,我有一个用于所有查询的 mysql 查询用户定义函数 - 我想将实际查询传递给配置文件元素,以便我可以识别页面中较重和较轻的查询(我知道我可以记录查询同样,只是想展示我如何从这个要求中受益)。另一个示例是将传入、传出函数数据和我想跟踪的任何其他调试信息附加到配置文件元素。

目前,我通过在将数据发送到通用函数的每个函数中放置代码行来手动跟踪开始、结束时间和其他调试信息,将其保存在全局变量中,并在脚本输出之后将其作为调试数据吐出。我将其扩展到脚本、模板等。我希望避免在每个函数、脚本、模板中手动输入数据。我希望它需要为每个函数独有的一些数据完成,但是重复的东西(开始,结束时间)不应该在每个臭查询中输入大声笑。

4

6 回答 6

3

我强烈建议您使用Xdebug来帮助您调试代码。自己这样做只会让你发疯!

Xdebug 可以进行开箱即用的功能跟踪等等。

例如:

// start tracing function calls to file
xdebug_start_trace('/path/to/trace_file.txt');
// your code here
xdebug_stop_trace();
于 2012-12-16T14:59:08.457 回答
2

命令行:

这太棒了:

echo <file_to_execute> | php \
  -B '$start = microtime(true);' \
  -E '$stop = microtime(true); echo $stop-$start;'

这使用了 PHP 中几乎不使用的两个选项,-B以及-E. 第一个选项允许您指定将在处理之前运行的代码stdin,在这种情况下,是我们要执行的文件。第二个选项允许您指定文件完成后将运行的代码。

无聊的 php.ini 设置:

此外,您可以设置auto_prepend_fileauto_append_file执行相同的操作。我在这里提到它是为了完整性,但是.ini为这种事情更改设置感觉不对,尽管我没有证据表明它是不好的。

分析热点:

如果您确定了一个运行缓慢的脚本,您可以使用xhprof 找出您大部分时间都花在了哪里。它是 Facebook 开发的一个工具,但现在是开源的。它可作为PECL 扩展使用,有助于减少安装痛苦。

实际调试:

XDebug是一个了不起的工具,它可以让您逐行、逐个函数地逐步执行代码,并且可以执行各种操作。如果您只是对代码执行进行计时,那么我不会使用 XDebug,但如果您真的想调试代码,那么这个扩展是您最好的朋友。


关于您的编辑:

我认为你做这一切都是错的。你真的需要两个环境:一个实时服务器和一个开发环境。实时服务器没有 xhprof 或 xdebug,但开发服务器有需要的东西。

于 2012-12-16T15:14:00.117 回答
1

使用php.ini文件的auto_prepend_fileauto_append_file选项。将它们指向一个文件,该文件在 Iqbal 的回答中进行计时。

于 2012-12-16T14:59:09.590 回答
1

除了 Xdebug 之外,还有XHProf,它非常好用且易于使用。

于 2012-12-16T15:34:35.613 回答
0

$time_start = 微时间(真);// 放在网页的开头

// 你的 PHP 代码

echo microtime(true) - $time_start; // 放在网页末尾

于 2012-12-16T14:55:13.830 回答
0

写一点require函数怎么样?

index.php,你可以做<?php require('requirer.php'); myRequirer(array('script1', 'script2'));

然后在requirer.php

<?php

require('file_with_logger_function');
function requirer($requireFiles)
{
    my_logger_function();
    foreach($requireFiles as $fileName) {
        require($fileName.'.php');
    }
    my_logger_function();
}
于 2012-12-16T14:59:55.660 回答