追查代码从(PHP)来
我会通过客户的服务器,运行疯狂的专有论坛 软件(vBulletin),甚至更糟糕的SEO器官功能障碍综合征(vbseo)。我无法将 列出来,其中页面的php代码来自哪里!如何跟踪此 URL回PHP页面: http://www.example.com/forum/members/connie.html 我刚刚加入与基于大量修改vBullitin与VBSEO插件安装代码的项目。这个特别的插件是可怕的意大利面代码,包含几十个include()s,.htaccess重定向和可能的.httpd.conf更改。然后它从数据库中提取字符串,所以我甚至不能使用grep来查找代码文件!追查代码从(PHP)来
是否有任何方法来堆栈跟踪PHP来记录运行生成页面的所有代码?我有root权限,但我不应该停止或重新启动服务器。进入生成页面的文件include()层次结构的简单列表就足够了。
请注意,我不能使用debug_backtrace因为我不知道我要找的代码! debug_backtrace函数与我所需要的完全相反。
谢谢。
听起来像是你需要通过它与Xdebug步骤。最常见的IDE支持它,如Netbeans和PHPStorm。
资源:
- Tracing PHP apps with Xdebug
- Xdebug with PHPstorm(我推荐)
- Xdebug with Eclipse
- Chrome Xdebug extension(我推荐)
- Firefox Xdebug plug-in
在这两个上面提到的IDE的,你可以CTRL +点击函数/方法,它会带你到文件中的行定义它。您还可以跟踪函数和变量的用法。
跟踪代码内置于xdebug。下面是Zend的一个例子:
<?php
xdebug_start_trace('c:/data/fac.xt');
print fac(7);
function fac($x)
{
if (0 == $x) return 1;
return $x * fac($x - 1);
}
xdebug_stop_trace();
?>
跟踪文件输出:
TRACE START [2007-10-26 12:18:48]
0.0068 53384 -> fac() C:\www\fac.php:5
0.0069 53584 -> fac() C:\www\fac.php:10
0.0069 53840 -> fac() C:\www\fac.php:10
0.0070 54096 -> fac() C:\www\fac.php:10
0.0070 54376 -> fac() C:\www\fac.php:10
0.0071 54656 -> fac() C:\www\fac.php:10
0.0072 54936 -> fac() C:\www\fac.php:10
0.0072 55216 -> fac() C:\www\fac.php:10
0.0073 55392 -> xdebug_stop_trace() C:\www\fac.php:13
0.0237 55392
TRACE END [2007-10-26 12:18:48]
退房的debug_backtrace功能 - 这应该始终可用,甚至在生产服务器上。
OP具体说,debug_backtrace与他所需要的完全相反。 – AlienWebguy
问题是我不知道代码在哪个文件中运行。这正是我想弄明白的! – dotancohen
那么再打个电话来调试所有文件中的backtrace!在活动服务器上安装调试扩展是非常愚蠢的,如果不允许重新启动Apache,则不可能。 – Robin
您也可以使用apd扩展;这将为每个请求写一个文件,其中包含请求期间调用PHP函数的日志。
非常好,谢谢! – dotancohen
但是,第二个看起来好像这个扩展需要程序员已经知道代码在哪个文件中运行。这与我所需要的完全相反。 – dotancohen
不一定;一旦你调用'apd_set_pprof_trace',每个后续函数调用都被扩展记录。如果你在请求中充分提前调用了这个调用(例如,通过在你的'.htaccess'文件中使用'auto_prepend_file'指令),你应该能够找到代码中最后的位置 –
来跟踪特定功能的来源,你可以这样做:
$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
见How to find out where a function is defined?
来跟踪特定类的起源,你可以这样做:
$reflClass = new ReflectionClass('class_name');
print $reflClass->getFileName() . ':' . $reflClass->getStartLine();
要获得进入制作页面的所有内容的列表,请执行以下操作:
var_dump(get_included_files());
为了得到一组在页面上定义的所有功能的列表,你可以这样做:
var_dump(get_defined_functions());
要得到网页上的所有用户定义的函数的列表,你可以做这个:
$defined_functions = get_defined_functions();
var_dump($defined_functions["user"]);
这个答案不是解决被问到的问题,而是解决标题的一种可能的解释。我没有downvoted,因为它包含有用的信息,但这个问题页面不是它的地方。欢迎来到堆栈溢出! – dotancohen
我感谢你不downvoting。在我的辩护中,问题是:“是否有任何方法可以对PHP进行堆栈跟踪,以记录运行时生成页面的所有代码?...一个简单的include()层次结构的文件,用于生成页面就足够了。“这个问题的第二部分由get_included_files()回答。这不会返回层次数组,只是一个数值数组,但这是我所知道的最接近的解决方案。关于“记录所有代码”的问题的第一部分是模棱两可的,但我认为这意味着所有的功能和方法,而我的答案的另一部分。 – kloddant
另外,OP说:“debug_backtrace函数与我需要的完全相反。” debug_backtrace函数的对面是我答案的第一部分。 – kloddant
谢谢,但我没有使用IDE。代码在远程服务器上运行,我无法在本地进行镜像。因此,我正在使用SSH进行VIM中的编辑。 – dotancohen
你可以[远程运行xdebug](http://xdebug.org/docs/remote),Netbeans是免费的。这里没有任何借口:) – AlienWebguy
我明白了,谢谢!现在我只需要说服主人让我安装它。谢谢! – dotancohen