Είμαι σίγουρος ότι δεν υπάρχει web developer που να μην γνωρίζει το Firebug. Για όποιον δεν το γνωρίζει είναι ένα firefox extension που βοηθάει τον developer στην κατασκευή ενός site. Μπορείτε να επεξεργαστείτε και να κάνετε debug javascript, css και html πάνω στα πραγματικά δεδομένα και σε πραγματικό χρόνο. Βεβαία οι δυνατότητες του δεν έχουν όρια…, εγώ πχ. σαν reverser τον χρησιμοποιώ και διαφορετικά. Δεν θέλω να επεκταθώ παραπάνω για τον firebug γιατί δεν είναι και το θέμα του άρθρου. Όποιος όμως θέλει να μάθει περισσότερα μια αναζήτηση στο google και θα βρει αξιόλογα πράγματα. Εγώ βρηκα σε ένα ελληνικό blog 11 tips.
Ξεφύγαμε στο θέμα μας. FirePHP ένα πολύ δυνατό firefox extension που παράλληλα με το firebug μπορούμε να κατευθύνουμε τα php (error και debug) μηνύματα μας στην κονσόλα του firebug. Στο site του firephp μπορείτε να βρείτε μία php class που μπορείτε να την ενσωματώσετε στο project σας και να χρησιμοποιείτε την firebug console.
Τι γίνεται όμως αν χρησιμοποιείτε την έκδοση 4 του php ακόμα ? Δεν υπάρχει τίποτα και δεν πρόκειται να βγάλουν, διότι όσο έψαξα, όλοι λένε “php4 is dead”. Προσωπικά δεν νομίζω να ισχύει αυτό διότι υπάρχουν πολλά projects που τρέχουν σε php4 και δεν έχουν περάσει σε php5. Εμείς π.χ. στην Netwerk δεν έχουμε γυρίσει 100% σε php5 σε όλα μας τα project.
Έτσι σκέφτηκα να δημιουργήσω from scratch (πολύ το γουστάρω αυτό) μία function που να εμφανίζει της μεταβλητές που θέλω, σε πρώτη φάση, και στην συνέχεια να την ενσωματώσω στον error handler του php και στον mysql error handler ώστε να μου εμφανίζει τα php και mysql errors. Το ποιο ωραίο είναι ότι μπορείς να δεις και ένα dump από ένα mysql query με μορφή table καθώς και ένα πολύπλοκο array ή object, γιατί ανοίγει ένα παραθυράκι στη μέση της οθόνης με scroll.
Το καλό με τον firephp είναι ότι δεν σου χαλάει το site ένα error που θα εμφανιστεί ή ένα dump που θέλεις να κάνεις. Άντε πολύ ασχοληθήκαμε με την θεωρεία, πάμε σε λίγο ανάλυση και κώδικα.
Πως δουλεύει ο firephp; Πολύ έξυπνο χρησιμοποιεί δικούς του headers με μία πολύ έξυπνη δομή. Υπάρχει η προηγούμενη έκδοση X-FirePHP (ασχολήθηκα λίγο και την παράτησα) και η τωρινή X-Wf που είναι πολύ ποιο βελτιωμένη.
Έφτιαξα λοιπόν μια function την dev (την ονόμασα έτσι γιατί την είχα και παλιά, απλά τα τύπωνε στον browser), η οποία στην ουσία στέλνει τα κατάλληλα headers. Για json χρησιμοποείσα την php class Services_JSON.
function dev($a0) {
static $messageIndex=1;
if ($messageIndex==1) {
header('X-Wf-Protocol-1:http://meta.wildfirehq.org/'.'Protocol/JsonStream/0.2');
header('X-Wf-1-Plugin-1:http://meta.firephp.org/'.'Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.2.0');
header('X-Wf-1-Structure-1:http://meta.firephp.org/'.'Wildfire/Structure/FirePHP/FirebugConsole/0.1');
}
$type='INFO';
$args=func_get_args();
if (is_string($type)) {
$a0=strtoupper($a0);
if ($a0=='LOG' || $a0=='INFO' || $a0=='WARN' || $a0=='ERROR' || $a0=='TABLE') {
array_shift($args);
$type=$a0;
}
}
include_once('json.php');
$json = new Services_JSON();
$_ar=debug_backtrace();
if (strstr($_ar[0]['file'],'cmysql')) {
array_shift($_ar);
}
elseif (is_array($args[0]) && $args[0][msg]) {
$_ar[0]=$args[0];
$args[0]=$args[0][msg];
}
foreach($args as $arg) {
if (is_resource($arg)) $arg=get_resource_type($arg);
$meta=array('Type'=>$type,'File'=>$_ar[0]['file'],
'Line'=>$_ar[0]['line']);
$msg='['.$json->encode($meta).','.$json->encode($arg).']';
$parts=explode("\n",chunk_split($msg,5000,"\n"));
for($i=0; $i
$part = $parts[$i];
if ($part) {
if(count($parts)>2) {
header('X-Wf-1-1-1-'.$messageIndex.':'.
(($i==0)?strlen($msg):'').'|'.
$part.'|'.(($i
}
else {
header('X-Wf-1-1-1-'.$messageIndex.':'.
strlen($part).'|'.$part.'|');
}
$messageIndex++;
}
}
}
}
Έπειτα χρησιμοποίησα την set_error_handler και την σύνδεσα με την dev για να έχω και τα php error.
function errorHandler($errno, $errmsg, $filename, $linenum, $vars) {
if(error_reporting()!=0) {
$errortype = array(
E_ERROR => "ERROR",
E_WARNING => "WARN",
E_PARSE => "ERROR",
E_USER_ERROR => "ERROR",
E_USER_WARNING => "WARN",
);
if ($errortype[$errno]) {
dev($errortype[$errno],array("msg"=>$errno.': '.
$errmsg,"file"=>$filename,"line"=>$linenum));
}
}
}
set_error_handler("errorHandler");
Σύνδεσα την κλάση που έχω για mysql query ώστε τα error να τα στέλνω στην dev. Τέλος μέσω της dev με τύπο table έδωσα τα αποτελέσματα των queries.
function dump() {
$dbDump = new CMySql();
$dbDump->query($this->Query,-1);
$body=array();
$title = $this->Query." (rows: ".$dbDump->num_rows().", fields: ".($dbDump->num_fields()-1).")";
if ($dbDump->next()) {
$header = array();
foreach($dbDump->record() as $i=>$v) $header[]=$i;
$body[] = $header;
do {
$row = array();
foreach($dbDump->record() as $v) $row[]=$v;
$body[] = $row;
}
while ($dbDump->next());
}
dev('table',array($title, $body));
}
Υπάρχουν και άλλοι τύποι στα headers που δεν ασχολήθηκα ακόμα. Trace, Dump και Groups, αλλά αυτά ας τα αφήσουμε στην php5, για να μην μας πουν ότι κάνουμε και προπαγάνδα κατά της ή ότι στηρίζουμε μόνο την php4. Απλά είναι κρίμα το firephp να είναι προνόμιο της php5, μόνο και μόνο επειδή το αποφάσισαν κάποιοι. Το μόνο configuration που χρειάζεται για να λειτουργήσουν τα παραπάνω, είναι να είναι ανοιχτό το output buffering ή να χρησιμοποιήσετε την ob_start()
php
firePHP, php