我无法弄清楚应用程序退出的位置。我宁愿不打扰调试器,并且添加declare(ticks=1);
到每个文件中会很痛苦(我没有心情处理 sed)。有人提出了类似的问题,但没有这些限制。
如何确定代码退出的位置?
澄清:
虽然这个问题类似于Fastest way to determine where PHP script exits,但我想找到一个无需调试器即可工作的解决方案。我知道如何使用调试器来做到这一点,但我并不总是可以使用这些工具。
我无法弄清楚应用程序退出的位置。我宁愿不打扰调试器,并且添加declare(ticks=1);
到每个文件中会很痛苦(我没有心情处理 sed)。有人提出了类似的问题,但没有这些限制。
如何确定代码退出的位置?
虽然这个问题类似于Fastest way to determine where PHP script exits,但我想找到一个无需调试器即可工作的解决方案。我知道如何使用调试器来做到这一点,但我并不总是可以使用这些工具。
您不需要将 declare(ticks) 添加到所有文件中。一个入口点就足够了:
<?php
function my_tick()
{
echo 'tick';
}
register_tick_function('my_tick');
declare (ticks=1)
{
include("lib.php");
echo "1";
test();
}
和 lib.php:
<?php
echo "2";
function test(){
echo "3";
}
当您正在寻找基于代码的解决方案时,我假设您的资源确实提供了单一入口点。
我通常使用一个变量来检测我的代码来记录事件,然后通过注册一个关闭函数来决定在退出点做什么:
class flightRecoder {
var $data;
var $err;
function __constructor() {
$this->data=array();
}
function error($errno, $errstr, $errfile, $errline)
{
if ($this->err<$errno) {
$this->err=$errno;
}
$this->note("ERROR! $errno $errstr", $errfile, $errline);
}
function note($note, $infile, $atline) {
$this->data[]="$note in $infile at $atline";
}
function finish() {
if ($this->errno || rand(1,20)==19) {
....
}
}
}
$log=new flightRecorder();
register_shutdown_function(array($log, 'finish'));
set_error_handler(array($log, 'error'));
在您的情况下,只需确保启用了 error_logging (以捕获致命错误),然后在任何退出语句之前注入注释。