Trace where code is coming from (PHP)

北战南征 提交于 2019-12-04 08:45:34

问题


I'm going through a customer's server, running crazy proprietary forum software (vBulletin) and even worse SEO mods (vbseo). I cannot figure out where the php code for a page is coming from! How to trace this URL back to a PHP page: http://www.example.com/forum/members/connie.html I just joined a project with the code based on a heavily modified vBullitin install with the VBSEO plugin. This particular plugin is horrific spaghetti code with tens of include()s, .htaccess redirects and possibly .httpd.conf changes. Then it pulls strings from a database so I cannot even use grep to find the code file!

Is there any way to stack-trace PHP to log all the code that runs to produce a page? I have root access but I am not supposed to stop or restart the server. A simple list of the include() hierarchy of files that went into producing the page would suffice.

Note that I cannot use debug_backtrace because I don't know where the code I'm looking for is! The debug_backtrace function is the exact opposite of what I need.

Thanks.


回答1:


Sounds like you need to step through it with Xdebug. Most common IDE's support it such as Netbeans and PHPStorm.

Resources:

  • Tracing PHP apps with Xdebug
  • Xdebug with Netbeans
  • Xdebug with PHPstorm (I recommend)
  • Xdebug with Eclipse
  • Chrome Xdebug extension (I recommend)
  • Firefox Xdebug plug-in

In both the above mentioned IDE's, you can CTRL+Click a function/method and it will take you to the line in the file where it is defined. You can also track usages for both functions and variables.

Tracing code is built-in to xdebug. Here's an example from 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 file output:

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]



回答2:


Check out the debug_backtrace function - this should always be available, even on production servers.




回答3:


You can also use the apd extension; this will write a file for each request containing a log of what PHP functions were called during the request.




回答4:


phptrace is an awesome and simple tool to trace php code executions, you can have a try.




回答5:


To trace the origin of a specific function, you can do this:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

See How to find out where a function is defined?

To trace the origin of a specific class, you can do this:

$reflClass = new ReflectionClass('class_name');
print $reflClass->getFileName() . ':' . $reflClass->getStartLine();

To get a list of all the includes that went into making a page, you can do this:

var_dump(get_included_files());

To get a list of all the functions that are defined on a page, you can do this:

var_dump(get_defined_functions());

To get a list of all the user-defined functions on a page, you can do this:

$defined_functions = get_defined_functions();
var_dump($defined_functions["user"]);


来源:https://stackoverflow.com/questions/7222160/trace-where-code-is-coming-from-php

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!