PHP:在每个文件的开头和结尾调用一个函数

时间:2012-12-16 14:42:29

标签: php debugging

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

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

[编辑] 我花了一些时间看xhprof& Xdebug的

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

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

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

6 个答案:

答案 0 :(得分:3)

我强烈建议您查看Xdebug,以帮助您调试代码。自己这样做只会让你疯狂!

Xdebug可以开箱即用function traces等等。

例如:

// start tracing function calls to file
xdebug_start_trace('/path/to/trace_file.txt');
// your code here
xdebug_stop_trace();

答案 1 :(得分: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 extension形式提供,有助于减少安装痛苦。

真正的调试:

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


关于您的编辑:

我认为你这样做是错的。您确实需要两种环境:实时服务器和开发服务器。实时服务器没有xhprof或xdebug,但开发服务器具有所需的功能。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

$ time_start = microtime(true); //放在网页的开头

//您的PHP代码

echo microtime(true) - $ time_start; //放在网页的最后

答案 5 :(得分:0)

写一点需要函数怎么样?

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();
}