5
// VERY BEGIN OF SCRIPT
$_SERVER['HX_startTime'] = microtime(true);

...

// MY SHUTDOWN FUNCTION
register_shutdown_function('HX_shutdownFn');
function HX_shutdownFn()
{
    // formatTimeSpan is simple time to string conversion function
    var_dump(formatTimeSpan(microtime(true) - $_SERVER['HX_startTime']));
}


...

// VERY END OF SCRIPT
var_dump(formatTimeSpan(microtime(true) - $_SERVER['HX_startTime']));

我有0.0005s。在脚本和1.1s结束时。在关机功能。正常吗?1秒在哪里丢失?

脚本是纯php,不使用db连接等。在WAMP服务器上测试(php v 5.3.9,apache 2.2.21)

4

3 回答 3

1

关闭某些连接并完成清理后,关闭函数将耗尽正常堆栈。延迟总是会作为此函数的性质发生,这取决于您之前所做的或尝试在此函数中执行的操作。

手册没有说明,但它是一个调试功能,也应该这样对待。

在正常操作中,您永远不应该使用它。没有优势。您可以在脚本末尾手动调用您的关闭函数,并为意外关闭留下一个处理程序。

于 2013-08-01T13:46:50.127 回答
1

正如其他人所提到的,可能还有其他关闭功能。此外,当对象超出范围(如果在全局范围内)时,会调用对象的析构函数。

您可以使用 XDebug 模块 ( http://xdebug.org/ ) 详细查看所有这些内容,尤其是在使用跟踪文件时。安装和配置 XDebug 后,您可以将 ?XDEBUG_TRACE=1 附加到您的 url 并查看整个页面执行的完整调用堆栈,包括每行的时间信息。

使用适当的选项,您还可以查看分配、参数名称和值、返回值和分配。这是一个非常强大和有用的工具。

这些是我用于 XDebug 的设置:

xdebug.default_enable=1
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1
xdebug.profiler_append=On
xdebug.auto_trace=Off
xdebug.show_mem_delta=On
xdebug.collect_return=On
xdebug.collect_params=4
xdebug.profiler_output_dir = /tmp
xdebug.profiler_output_name = profile.%H.%t.%p
xdebug.var_display_max_children = 999
xdebug.var_display_max_data = 99999
xdebug.var_display_max_depth = 100
xdebug.remote_enable=1
xdebug.cli_color=1
xdebug.show_local_vars=1    
xdebug.show_mem_delta=1
xdebug.collect_return=1
xdebug.collect_assignments=1
xdebug.collect_params=4
xdebug.collect_includes=1
xdebug.trace_enable_trigger=1
xdebug.trace_output_dir=/tmp
xdebug.trace_output_name=trace.%t.%R.%p
于 2013-08-07T19:57:24.890 回答
0

我假设这里的代码比您发布的要多 - 在这种情况下,如果您将任何输出传输到客户端,脚本在发送之前不会关闭。

正如评论中提到的,还可能注册了其他关闭功能,您可能不知道这些功能。

如果一切都失败了,尝试隔离这个脚本(所以只有你发布的行,即使没有任何替代品...)并比较从命令行和你的网络服务器运行它。可能会涉及一些特定于服务器的开销。

于 2013-03-04T11:39:34.003 回答