Output Buffering mit ob_gzhandler macht Probleme

The_Fang

Mitglied
Hola
Ich wollte mir eine kleine "errorReporting" Klasse schreiben , die falls ein Fehler auftritt nur einen Fehlerreport aussupckt ohne auch nur einbisschen Code zu zeigen, der vor dem Fehler hätte ausgesuckt werden sollen. Um diese zu gewährleisten muss man sich der "Output Buffering" Funktionen von PHP bedienen.
Es hat alles funktioniert bis ich ob_start() gesagt habe das es den Output komprimieren soll. Jetzt zeigt er keinen ErrorReport mehr an, wenn ein Fehler auftritt. Wäre nett, wenn ihr mir sagen könnt, wie ich das mit Komprission hinbekomme.

Der Folgene Code funktioniert, aber ohne Komprission.
PHP:
ob_start();
error_reporting(E_ALL);
set_error_handler("handler");

function handler($errorNumber, $errorString, $errorFile, $errorLine) {
	ob_end_clean();
	echo '<pre>';
	echo 'no   : ' . $errorNumber . "\n";
	echo 'str  : ' . $errorString . "\n";
	echo 'file : ' . $errorFile . "\n";
	echo 'line : ' . $errorLine . "\n";
	echo '</pre>';
	die;
}

echo "was geht?";
//require('class.php');
trigger_error("hallo");
echo "haha";
ob_end_flush();

Code mit angeschalteter Komprission:
PHP:
ob_start("ob_gzhandler");
error_reporting(E_ALL);
set_error_handler("handler");

function handler($errorNumber, $errorString, $errorFile, $errorLine) {
	ob_end_clean();
	echo '<pre>';
	echo 'no   : ' . $errorNumber . "\n";
	echo 'str  : ' . $errorString . "\n";
	echo 'file : ' . $errorFile . "\n";
	echo 'line : ' . $errorLine . "\n";
	echo '</pre>';
	die;
}

echo "was geht?";
//require('class.php');
trigger_error("hallo");
echo "haha";
ob_end_flush();

Danke
 
die zlib ist entweder direkt mit PHP kompiliert (auf unix/linux systemen) oder auf windows system.... entweder rein kompiliert auch, oder extern als modul gelinkt... einfach mal n wenig in der php.ini rum schüffeln...

kann sein das der handler beim clearen des buffern probleme macht, weiß net, dazu müsste man n wenig source level debuging betreiben...
 
In der php.ini habe ich nichts gefunden, das aussieht wie die Aktivierung des Modules. Ich bin mir recht sicher das es schon in PHP rein kompliert wurde.

kann sein das der handler beim clearen des buffern probleme macht, weiß net, dazu müsste man n wenig source level debuging betreiben...
Und wie macht man das?

EDIT:
Ich habe gerade getestet, ob ob_gzhandler funktioniert. und jetzt bin ich zu 100% sicher, dass es funktioniert, da die Date ohne Kompression ist fast 100KB groß aber mit Kompression sind es nur ein bisschen mehr als 12KB.

Testcode:
PHP:
ob_start("ob_gzhandler");
for($i=1;$i<=5000;$i++) {
	echo "was geht?";
	echo "nix";
	echo $i."<br>";
}
ob_end_flush();
 
Zuletzt bearbeitet:
nun zuallerwerstmal...

es ist nicht sicher ob der fehler an PHP oder am script liegt...

und sourceleven debuging, macht man mit einem debuger...
da gibts z.B. von Zend einen sehr guten...
damit setze eine haltepunkt vor der stelle wo du den fehler vermutest, und gehst die stelle wo der fehler vermutlich is im einzelschritt durch... dann erkennst du sehr schnell wo das problem ist.

wenn das problem an PHP selbst liegt, also an ner PHP funktion... dann haste im prinzip schlechte karten, dann kannst du nur mit einem C source level debuger weiter arbeiten und versuchen die fehler im php code zu finden.. oder warten bis die leute von php.net den gefunden haben...

vieleicht versuchst dus auch einfach mal mit ner anderen PHP version? wie währs mit PHP5 beta?
 
gelöst

Ich habe mein Problem jetzt gelöst. Vielen Dank für die Hilfe.
Ich verstehe zwar noch immer nicht warum das original Script geschtrieckt hat.

Das funktioiert:
PHP:
<?php
ob_start("ob_gzhandler");
error_reporting(E_ALL);
set_error_handler("handler");

function handler($errorNumber, $errorString, $errorFile, $errorLine) {
	ob_end_clean();
	ob_start("ob_gzhandler");
	echo '<pre>';
	echo 'no   : ' . $errorNumber . "\n";
	echo 'str  : ' . $errorString . "\n";
	echo 'file : ' . $errorFile . "\n";
	echo 'line : ' . $errorLine . "\n";
	echo '</pre>';
	ob_end_flush();
	die;
}

echo "was geht?";
trigger_error("hallo");
echo "nix";
ob_end_flush();
?>
 
Zurück