xoops forums

frankblack

Just can't stay away
Posted on: 2009/7/29 13:27
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#1

PHP-Debugging without XOOPS

Hope this is the right forum and someone is interested and perhaps this isn't covered anywhere else?

I was always a bit annoyed about the XOOPS-internal debugging especially when working with (x)ajax. This gives you always (mostly) problems.

So I ended up using FireBug + FirePHP as addons for Firefox. I rewrote class/logger/render.php to output the debug to FirePHP. With this solution you are highly flexible.

As a module developer you can write any kind of debug notice you want without destroying the layout with echos or even writing to a logfile.

Example:
$fb->log($thevariwanttodisplay);


Of course you could adapt render.php to your needs like displaying server vars etc.

You can get FirePHP HERE

And here is the code for class/logger/render.php (hope the textsanitizer won't mess up):
<?php
/**
 * XOOPS Logger renderer
 *
 * You may not change or alter any portion of this comment or credits
 * of supporting developers from this source code or any supporting source code
 * which is considered copyrighted (c) material of the original comment or credit authors.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * @copyright       The XOOPS Project http://sourceforge.net/projects/xoops/
 * @license         http://www.fsf.org/copyleft/gpl.html& ...  public license
 * @package         kernel
 * @subpackage      logger
 * @since           2.3.0
 * @author          Skalpa Keo <skalpa@xoops.org>
 * @author          Taiwen Jiang <phppp@users.sourceforge.net>
 * @version         $Id: render.php 2633 2009-01-10 03:09:41Z phppp $
 *
 * @todo            Not well written, just keep as it is. Refactored in 3.0
 */

defined'XOOPS_ROOT_PATH' ) or die();
//ob_start();

global $xoopsUser;

if (
is_object($xoopsUser)) {
require_once 
XOOPS_ROOT_PATH.'/FirePHPCore/FirePHP.class.php';
$fb FirePHP::getInstance(true);
$ret '';

$this->addExtra'Included files'count get_included_files() ) . ' files' );
$memory 0;
if ( 
function_exists'memory_get_usage' ) ) {
    
$memory memory_get_usage() . ' bytes';
} else {
    
$os = isset( $_ENV['OS'] ) ? $_ENV['OS'] : $_SERVER['OS'];
    if ( 
strposstrtolower$os ), 'windows') !== false ) {
        
$out = array();
        
exec('tasklist /FI "PID eq ' getmypid() . '" /FO LIST'$out );
        
$memory substr$out[5], strpos$out[5], ':') + 1) . ' [Estimated]';
    }
}
if ( 
$memory ) {
    
$this->addExtra'Memory usage'$memory );
}

if ( empty(
$mode) || $mode == 'errors' ) {
    
$types = array(
        
E_USER_NOTICE => 'Notice',
        
E_USER_WARNING => 'Warning',
        
E_USER_ERROR => 'Error',
        
E_NOTICE => 'Notice',
        
E_WARNING => 'Warning',
        
E_STRICT => 'Strict',
    );
    
$fberrors = array();

    foreach ( 
$this->errors as $error ) {
        
$fberrorstype = isset( $types$error['errno'] ] ) ? $types$error['errno'] ] : 'Unknown';
        
$fberrors[] = array($fberrorstype.sprintf": %s in file %s line %s"$this->sanitizePath($error['errstr']), $this->sanitizePath($error['errfile']), $error['errline'] ));
    }
if (!empty(
$fberrors)) $fb->table('Errors'$fberrors);
}

if ( empty(
$mode) || $mode == 'queries' ) {
    
$fbqueries = array();

    
$pattern '/b' preg_quote($GLOBALS['xoopsDB']->prefix()) . '_/i';

    foreach (
$this->queries as $q) {
        
$sql preg_replace($pattern''$q['sql']);
        if (isset(
$q['error'])) {
            
$fbqueries[] = array(htmlentities($sql).' Error number: '.$q['errno'].' Error message: '.$q['error']);
        } else {
            
$fbqueries[] = array(htmlentities($sql));
        }
    }
    
$fbqueries[] = array('Total: '.count($this->queries).' queries');

$fb->table('Queries'$fbqueries);
}

if ( empty(
$mode) || $mode == 'blocks' ) {
    
$fbblocks = array();

    foreach (
$this->blocks as $b) {
        if (
$b['cached']) {
            
$fbblocks[] = array(htmlspecialchars($b['name']).': Cached (regenerates every '.intval($b['cachetime']).' seconds)');
        } else {
            
$fbblocks[] = array(htmlspecialchars($b['name']).': No Cache');
        }
    }
    
$fbblocks[] = array('Total: '.count($this->blocks).' blocks');

    if (
count($this->blocks) > 0$fb->table('Blocks'$fbblocks);
}

if ( empty(
$mode) || $mode == 'extra' ) {
    
$fbextra = array();

    foreach (
$this->extra as $ex) {
        
$fbextra[] = array(htmlspecialchars($ex['name']).': '.htmlspecialchars($ex['msg']));
    }

    
$fb->table('Extra'$fbextra);
}

if ( empty(
$mode) || $mode == 'timers' ) {
    
$fbtimers = array();

    foreach ( 
$this->logstart as $k => $v ) {
        
$fbtimers[] = array(htmlspecialchars($k).' took ' sprintf"%.03f"$this->dumpTime($k) ) . ' seconds to load.');
    }

    
$fb->table('Timers'$fbtimers);
}
}

?>


Output is still looking a bit ugly, but better than before.

Hope this is helpful to someone?

edit: added the query for xoopsUser in order to hide the debug for guests

hervet

Friend of XOOPS
Posted on: 2009/7/29 14:15
hervet
hervet (Show more)
Friend of XOOPS
Posts: 2267
Since: 2003/11/4
#2

Re: PHP-Debugging without XOOPS

Hello frank,

Quote:

frankblack wrote:
Hope this is helpful to someone?

Yes to me !
This is an excellent initiative.
Hope this code will be part of new versions.

Bye,
Hervé

frankblack

Just can't stay away
Posted on: 2009/7/29 14:20
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#3

Re: PHP-Debugging without XOOPS

Thx for the flowers!

Maybe you can add some extra? Re-writing was made very quickly since I discovered this solution this afternoon.

I tried to display all used vars, but it did not work out for me.

Edit: you have to place the folder called "FirePHPCore" with its contents to your XOOPS-root.

frankblack

Just can't stay away
Posted on: 2009/7/29 15:35
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#4

Re: PHP-Debugging without XOOPS

Okay, just tried to add smarty-debug and found a snippet for doing this. Unfortunately this code is a bit outdated and shows up not collapsed in FirePHP. So use this at your own risk.

Step 1: edit class/template.php should be line 56 from
if ( $xoopsConfig['debug_mode'] == ) {

to
if ( $xoopsConfig['debug_mode'] == ) {


Step 2: edit include/common.php should be line 182 from
if ( $xoopsConfig['debug_mode'] == || $xoopsConfig['debug_mode'] == ) {

to
if ( $xoopsConfig['debug_mode'] == || $xoopsConfig['debug_mode'] == || $xoopsConfig['debug_mode'] == ) {


Step 3: edit class/smarty/internals/core.display_debug_console.php and replace the complete code with this
<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */

/**
 * Smarty debug_console function plugin
 *
 * Type:     core<br>
 * Name:     display_debug_console<br>
 * Purpose:  display the javascript debug console window
 * @param array Format: null
 * @param Smarty
 */

if (!defined('XOOPS_ROOT_PATH')) die('XOOPS_ROOT_PATH not defined');
require_once 
XOOPS_ROOT_PATH.'/FirePHPCore/FirePHP.class.php';

function 
smarty_core_display_debug_console($params, &$smarty)
{
    
//get required debug variables
    
$assigned_vars $smarty->_tpl_vars;
    
ksort($assigned_vars);

    
$config_vars = array();
    if(@
is_array($smarty->_config[0])){
        
$config_vars $smarty->_config[0];
        
ksort($config_vars);
    }

    
$firephp FirePHP::getInstance(true);

    
$firephp->group('Smarty Debug Output');
    
/*Log template files*/
    
$firephp->group('included templates & config files (load time in seconds)');
    foreach( 
$smarty->_smarty_debug_info as $tml ){
        
$msg str_repeat('--'$tml['depth']);
        
$msg .= ( $tml['depth'] != ) ? '>' '';
        if (isset(
$tml['exec_time'])) $getthetime ' (' substr($tml['exec_time'], 07) . 's)';
        else 
$getthetime '';
        
$msg .= $tml['filename'] . $getthetime;
        
$firephp->log($msg);
    }
    
$firephp->groupEnd(); //end group 'included templates &...'


    /*Log assigned template variables*/
    
$firephp->group('assigned template variables');
    foreach( 
$assigned_vars as $key => $value ){
        
$firephp->log($value'{$' $key '}');
    }
    
$firephp->groupEnd(); //end group 'assigned template variables'


    /*Log assigned config file variables (outer template scope)*/
    
$firephp->group('assigned config file variables (outer template scope)');
    
/*Check if there is something in the config*/
    
if(!empty($config_vars)){
        foreach( 
$config_vars as $key => $value ){
            
$firephp->log($value'{#' $key '#}');
        }
    } else{
        
$firephp->log("No configuration values available");
    }
    
$firephp->groupEnd(); //end group 'assigned config file variables (outer template scope)'


    
$firephp->groupEnd(); //end group 'Smarty Debug Output'

}

/* vim: set expandtab: */

?>


Have fun!

culex

Module Developer
Posted on: 2009/7/29 15:58
culex
culex (Show more)
Module Developer
Posts: 705
Since: 2004/9/23
#5

Re: PHP-Debugging without XOOPS

Nice one :) Very handy indeed.
Programming is like sex:
One mistake and you have to support it for the rest of your life.

Mamba

Moderator
Posted on: 2009/7/29 16:09
Mamba
Mamba (Show more)
Moderator
Posts: 10873
Since: 2004/4/23
#6

Re: PHP-Debugging without XOOPS

Excellent initiative!

I think, Trabis did some work on PQP, so maybe this could be merged, if possible and if it makes sense.

BTW - did anybody look into Webgrind?
Support XOOPS => DONATE
Use 2.5.10 | Docs | Modules | Bugs

frankblack

Just can't stay away
Posted on: 2009/7/29 16:13
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#7

Re: PHP-Debugging without XOOPS

webgrind needs xdebug and this means php.ini has to be changed. This is impossible for some. So this is no real alternative yet.

Mamba

Moderator
Posted on: 2009/7/29 16:25
Mamba
Mamba (Show more)
Moderator
Posts: 10873
Since: 2004/4/23
#8

Re: PHP-Debugging without XOOPS

Quote:
webgrind needs xdebug and this means php.ini has to be changed. This is impossible for some. So this is no real alternative yet.

I assume, most if not all developers could change php.ini on their development computer, right? And normal users don't need it, anyway, correct?
Support XOOPS => DONATE
Use 2.5.10 | Docs | Modules | Bugs

frankblack

Just can't stay away
Posted on: 2009/7/29 16:29
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#9

Re: PHP-Debugging without XOOPS

Partially correct! EVERYONE needs some kind of debugger. What about those not able to change the php.ini sitting there with a blank page and no debug information is shown?

So debug at its best should work for all, not only for the developers.

frankblack

Just can't stay away
Posted on: 2009/7/29 22:07
frankblack
frankblack (Show more)
Just can't stay away
Posts: 830
Since: 2005/6/13
#10

Re: PHP-Debugging without XOOPS

I made a small package for you.

Install Firebug and FirePHP for Firefox and set up as told on firephp.org (just a few clicks).

Download ZIP, unpack and upload files / folders via FTP. Backup the files that have to be overwritten. Also make a backup of the database, because two entries have to be made.

Browse the file www.yourdomain.com/adddebug.php. Delete this immediately afterwards.

Visit Administration / System / General Settings. There are now two more options for the debug modes: FirePHP and FirePHP + Guest.

The last option enables debugging even when you are not logged in as an user. But this option is more important for developers developing locally.

Installation and use of the new debug modes at your own risk!

Good luck!

edit: did I mention that this only for PHP5 and XOOPS 2.3.3?

smarty-debug is now un-collapsed and database-errors have now their own section. I am still looking for a good way to display ALL used variables.

EDIT2: Damn, I should burn in hell. The ZIP missed some files. ZIP should be OK now. Sorry! Working in the night is not so good in my age.