php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.01.2010, 22:16  
stebi
Gast
 
Beiträge: n/a
Standard php://stdout und libapache2-mod-php5, wohin werden Nachrichten geschrieben

Huhu,

ich habe ein Test-Script erstellt, welches eine File-Resource (php://stdout) öffnet und einen Text dort reinschreibt. Das Script wird mit dem Apache-PHP-Modul aufgerufen.

PHP-Code:
echo 'call fopen<br />';
$fp fopen('php://stdout''a');
var_dump($fp);
echo 
'<br />call fwrite<br />';
var_dump(fwrite($fp'hallo'));
die(
'<br />ENDE'); 
Das Script läuft auch ohne Fehler durch (ERROR-Reporting in der PHP-INI ist auch gesetzt.)
Ausgabe:
Code:
call fopen
resource(4) of type (stream) 
call fwrite
int(5) 
ENDE
Ich habe erwartet, dass der Text 'hallo' im Browser erscheint, aber irgendwie verschwindet er im Nirvana (im HTML-Quelltext ist er übrigens auch nicht).

Wohin werden Nachrichten bei 'php://stdout' im PHP-Apache-Modul geschrieben bzw. wie kann man beeinflussen, dass diese in der Ausgabe im Browser erscheinen?

PS: fopen mit Modus 'w' hat auch nicht geholfen.
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.01.2010, 22:21  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Probiers mal ohne die. Möglicherweise wird der Buffer erst später geflusht. Muss zugeben, ich habe das noch nie probiert. Lt. Manual soll stdout aber genau wie echo / write funktionieren.

Das Manual empfielt übrigens STDIN, STDOUT und STDERR zu verwenden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 16.01.2010, 22:39  
stebi
Gast
 
Beiträge: n/a
Standard

Das mit den Konstanten habe ich auch im Manual gelesen.
Zitat:
Note that PHP exhibited buggy behavior in this regard until PHP 5.2.1. It is recommended that you simply use the constants STDIN, STDOUT and STDERR instead of manually opening streams using these wrappers.
Nur ist die Konstante STDOUT bei mir nicht gesetzt und deshalb kann ich sie nicht benutzen (vermutlich nur im CLI?). Die PHP-Version ist auch > 5.2.1
die() habe ich auch mal durch ein echo ersetzt.

Aktualisiertes Script:
PHP-Code:
echo 'VERSION: '.phpversion();
var_dump(STDOUT);
echo 
'<br />call fopen<br />';
$fp fopen('php://stdout''a');
var_dump($fp);
echo 
'<br />call fwrite<br />';
var_dump(fwrite($fp'hallo'));
echo(
'<br />ENDE'); 
Ausgabe:
Code:
VERSION: 5.2.6-1+lenny3
Notice: Use of undefined constant STDOUT - assumed 'STDOUT' in /mnt/www/htdocs/test.php on line 3
string(6) "STDOUT" 
call fopen
resource(3) of type (stream) 
call fwrite
int(5) 
ENDE
 
Alt 16.01.2010, 23:39  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.240
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Das geht dann IMHO nach wie vor an stdout und damit ins Nirvana. Unter Lunux wirds im /dev/null landen. Wieso sollte es auch im Browser erscheinen? Es wird nirgendwo im Handbuch garantiert, dass die Ausgabe ungebogen werden würde. Vom Script her: Ressourcen und Streams kann man mit PHP leider nicht woanders hin unbiegen.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline  
Alt 16.01.2010, 23:43  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich würde das schon so interpretieren:
Zitat:
php://output allows you to write to the output buffer mechanism in the same way as print() and echo().
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 17.01.2010, 00:03  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.240
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Hmmmm. Habs im ersten Moment auf die ob-Puffer bezogen. Aber wenn die nicht aktiv sind, müsste es ja genauso umgeleitet sein im Apache. Tatsache ist, dass im apache-sapi nichts darauf hindeutet, dass es umgeleitet wird. Der Code:
Code:
if (!strcasecmp(path, "stdout")) {
		if (!strcmp(sapi_module.name, "cli")) {
			static int cli_out = 0;
			fd = STDOUT_FILENO;
			if (cli_out++) {
				fd = dup(fd);
			} else {
				cli_out = 1;
				file = stdout;
			}
		} else {
			fd = dup(STDOUT_FILENO);
		}
Der einzige Unterschied zwischen cli und anderen scheint zu sein, ob der File-Descriptor geclont wird oder nicht.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline  
Alt 17.01.2010, 15:20  
stebi
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Ich würde das schon so interpretieren:
Zitat:
php://output allows you to write to the output buffer mechanism in the same way as print() and echo().
Ah, mit php://output funktionierts unter dem Apache-Modul und im CLI - perfekt, dann werde ich das benutzen.
Mit 'php://stdout' bekomme ich nur im CLI im write-Mode 'w' eine Ausgabe. Da es beim Modul nach /dev/null (ich habe die Ausgabe zumindest nirgends gefunden) schreibt, ist das unpraktisch

Hier hatte jemand ähnliche Probleme, auch, dass die Konstante nicht gesetzt war.
PHP Bugs: #47397: php://stdout gives odd behavior under CGI/Apache
 
Alt 17.01.2010, 16:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ach Mist, das habe ich vollkommen überlesen
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php stdout, libapache2-mod-php5, php stdout browser, resource(3) of type (stream), stdout php, php stdout fopen, php write stdout, use of undefined constant allow bbcode 3, php ausgabe stdout, php cgi echo write stdout stderr, php echo wohin, sdout to browser php, \resource(3) of type (stream)\, php stdout nicht gesetzt, php type standardausgabe, apache php stdout, send stdout to nirvana, php standardausgabe, php apache echo ausgaben, php wohin echo

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:58 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum