Anything thing that creates a properly formatted XDebug trace file can use the Visualize Backtrace module to parse and process it into a *.dot function call stack visualization.
In some cases, you can just copy and paste the trace file into the folder. But in other cases, you may want to run another PHP application, and get dynamic backtrace visualizations.
This means that you could run Joomla!, Wordpress, PHPMyAdmin, CiviCRM within a subdirectory of a Drupal installation, and dynamically graph their function call stacks into a flowchart.
I did this as a test in preparation for my Drupal Camp presentation, and thought that I'd pass it along here.
Here's how I was able to do this.
1.) Enable the XDebug traces from the root .htaccess of a localhost Drupal installation. (http://localhost/)
2.) Create a second Drupal installation as a subdirectory of the first installation. Say for example, in a folder named "d53" (i.e. (http://localhost/d53))
3.) Also install Joomla/Wordpress/whatever as a subdirectory of the root Drupal installation. Add a prefix of "d53_" to the folder, so that it reads "d53_joomla" and appears at http://localhost/d53_joomla
4.) Copy the contents of the "d53_joomla" folder in as a subdirectory of the "d53" folder, and rename it to just "joomla" (i.e. at /library/webserver/documents/d53/joomla)
5.) Copy the Joomla-specific color codes listed down below into the visualize_backtrace_get_lookup_table_values() function after the line else if ($source_code_link_location == "local") { in the "d53" version of the visualize_backtrace.module
6.) Create an XDebug trace file on the joomla installation by doing a page load at http://localhost/d52_joomla
7.) Go to the trace files listed at the d53 installation at: http://localhost/d53/view_traces, and the second to the top trace files will be from the joomla installation. Click on the trace files from here, and be able to dynamically graph the call stacks and link back to the source code.
NOTE: This works because the base path of /library/webserver/documents/d52/ is being deleted from the beginning of the /library/webserver/documents/d52_joomla/ XDebug filenames, and therefore correctly links up to the source code located in the d53 subdirectory. In other words, the joomla source code line numbers will be properly linked to at http://localhost/d53/view_source/joomla/index.php.
So be sure that the "Local Copy"is selected for the "Display Source Code Located at:" admin option.
Here are the file-specific color codes for Joomla.
These probably could be spun off into an *.inc file along with other optional programs like Wordpress, CiviCRM, etc.
Otherwise the entire *.dot visualization will be entirely grey, which is hard to visually parse.
else if ($source_code_link_location == "local") {
// JOOMLA!
$lookup_table["joomla/components/com_banners/models/banner.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/content.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/controller.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/helpers/icon.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/helpers/query.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/helpers/route.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/models/article.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/view.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/views/article/tmpl/default.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/components/com_content/views/article/view.html.php"] = array("node_color_hex" => "#F16913", "source_code_line_url" => "#F16913");
$lookup_table["joomla/libraries/joomla/filesystem/folder.php"] = array("node_color_hex" => "#FDBF6F", "source_code_line_url" => "#FDBF6F");
$lookup_table["joomla/libraries/joomla/i18n/language.php"] = array("node_color_hex" => "#FDBF6F", "source_code_line_url" => "#FDBF6F");
$lookup_table["joomla/libraries/joomla/utilities/simplexml.php"] = array("node_color_hex" => "#FDBF6F", "source_code_line_url" => "#FDBF6F");
$lookup_table["joomla/libraries/joomla/utilities/string.php"] = array("node_color_hex" => "#FDBF6F", "source_code_line_url" => "#FDBF6F");
$lookup_table["joomla/libraries/phputf8/utf8.php"] = array("node_color_hex" => "#FDBF6F", "source_code_line_url" => "#FDBF6F");
$lookup_table["joomla/modules/mod_banners/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_banners/mod_banners.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_banners/tmpl/default.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_breadcrumbs/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_breadcrumbs/mod_breadcrumbs.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_footer/mod_footer.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_footer/tmpl/default.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_mainmenu/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_mainmenu/legacy.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_mainmenu/mod_mainmenu.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_mainmenu/tmpl/default.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_newsflash/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_newsflash/mod_newsflash.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_newsflash/tmpl/_item.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_newsflash/tmpl/default.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_search/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_search/mod_search.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_search/tmpl/default.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_syndicate/helper.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/modules/mod_syndicate/mod_syndicate.php"] = array("node_color_hex" => "#FC8D59", "source_code_line_url" => "#FC8D59");
$lookup_table["joomla/plugins/content/emailcloak.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/plugins/content/loadmodule.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/plugins/content/pagebreak.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/plugins/content/pagenavigation.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/plugins/content/sef.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/plugins/content/vote.php"] = array("node_color_hex" => "#FDCDAC", "source_code_line_url" => "#FDCDAC");
$lookup_table["joomla/includes/application.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/includes/framework.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/includes/menu.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/includes/pathway.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/includes/router.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/index.php"] = array("node_color_hex" => "#6BAED6", "source_code_line_url" => "#6BAED6");
$lookup_table["joomla/libraries/joomla/application/application.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/component/controller.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/component/helper.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/component/model.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/component/view.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/helper.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/menu.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/module/helper.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/pathway.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/application/router.php"] = array("node_color_hex" => "#9EBCDA", "source_code_line_url" => "#9EBCDA");
$lookup_table["joomla/libraries/joomla/base/observer.php"] = array("node_color_hex" => "#B3CDE3", "source_code_line_url" => "#B3CDE3");
$lookup_table["joomla/libraries/joomla/base/tree.php"] = array("node_color_hex" => "#B3CDE3", "source_code_line_url" => "#B3CDE3");
$lookup_table["joomla/libraries/joomla/cache/cache.php"] = array("node_color_hex" => "#C6DBEF", "source_code_line_url" => "#C6DBEF");
$lookup_table["joomla/libraries/joomla/cache/handler/callback.php"] = array("node_color_hex" => "#C6DBEF", "source_code_line_url" => "#C6DBEF");
$lookup_table["joomla/libraries/joomla/cache/storage.php"] = array("node_color_hex" => "#C6DBEF", "source_code_line_url" => "#C6DBEF");
$lookup_table["joomla/libraries/joomla/cache/storage/file.php"] = array("node_color_hex" => "#C6DBEF", "source_code_line_url" => "#C6DBEF");
$lookup_table["joomla/libraries/joomla/document/document.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/document/html/html.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/document/html/renderer/head.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/document/html/renderer/message.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/document/html/renderer/module.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/document/html/renderer/modules.php"] = array("node_color_hex" => "#DEEBF7", "source_code_line_url" => "#DEEBF7");
$lookup_table["joomla/libraries/joomla/environment/request.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/environment/response.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/environment/uri.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/event/dispatcher.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/event/handler.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/event/helper.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/event/plugin.php"] = array("node_color_hex" => "#C7EAE5", "source_code_line_url" => "#C7EAE5");
$lookup_table["joomla/libraries/joomla/factory.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/filter/input.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/methods.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/registry/format.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/registry/registry.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/session/session.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/session/storage.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/utilities/date.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/utilities/error.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/utilities/utility.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/loader.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/plugins/system/debug.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/plugins/system/remember.php"] = array("node_color_hex" => "#ABD9E9", "source_code_line_url" => "#ABD9E9");
$lookup_table["joomla/libraries/joomla/database/database.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/database/database/mysql.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/database/table.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/database/table/content.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/database/table/session.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/session/storage/database.php"] = array("node_color_hex" => "#BEAED4", "source_code_line_url" => "#BEAED4");
$lookup_table["joomla/libraries/joomla/html/html.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/libraries/joomla/html/html/behavior.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/libraries/joomla/html/html/image.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/libraries/joomla/html/parameter.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/templates/rhuk_milkyway/index.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/templates/system/html/modules.php"] = array("node_color_hex" => "#FDE0EF", "source_code_line_url" => "#FDE0EF");
$lookup_table["joomla/libraries/joomla/user/authorization.php"] = array("node_color_hex" => "#FFFFBF", "source_code_line_url" => "#FFFFBF");
$lookup_table["joomla/libraries/joomla/user/user.php"] = array("node_color_hex" => "#FFFFBF", "source_code_line_url" => "#FFFFBF");
$lookup_table["joomla/libraries/phpgacl/gacl.php"] = array("node_color_hex" => "#FFFFBF", "source_code_line_url" => "#FFFFBF");
}
Comments
Comment #1
KentBye commentedI forgot another snippet that is helpful.
Because there are a lot of function calls for any given page load, it is helpful to split them into logical sections so that they are quicker to plot and easier to read.
In Joomla!s case, the "JSite->render" with a $level = 2 seems to be a logical breakpoint, and so be sure to add this Joomla!-specific snippet into the visualize_backtrace_generate() function as well.
Comment #2
nadavoid commentedI think that this note highlights one of the big reasons I'm loving Drupal and its community more and more. Drupal is a tool. A swiss army knife. Ready to do your bidding. Flexibility without being too complicated. Drupal can now help you with your Joomla or Wordpress development skills, no problem. Maybe even TYPO3? why not!
Comment #3
KentBye commentedYeah, it'll even do TYPO3 traces. Like I said, anything that generates a valid XDebug trace file can be parsed. So that certainly includes any PHP program.
And yes, maybe a tool like this will attract some more developers from other CMSs to take a closer look at Drupal.
An addition could be to add an admin option for which CMS you're profiling and have a series of *.inc files that have specific color coding information for the filenames. But I'll leave that exercise to someone who is trying to scratch that itch. :)
Back to getting the latest updates in shape to get released.
Comment #4
(not verified) commentedAutomatically closed -- issue fixed for two weeks with no activity.