Heim  >  Artikel  >  Backend-Entwicklung  >  Analysieren Sie den Unterschied zwischen php://output und php://stdout

Analysieren Sie den Unterschied zwischen php://output und php://stdout

不言
不言Original
2018-05-07 09:27:171492Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Analyse der Nutzungsunterschiede zwischen php://output und php://stdout sowie Beispielcode-Sharing. Freunde in Not können darauf zurückgreifen.

PHP enthält eine Reihe von Ausgabestreams, die mit php:// beginnen, wie php://stdin, php://stdout usw. Als ich mir heute den Code ansah, kam mir plötzlich eine Frage: Was ist der Unterschied zwischen php://output und php://stdout?

Die Antwort finden Sie in der offiziellen PHP-Dokumentation. Die Erklärungen zu den Eingabeströmen php://stdin und php://input sind wie folgt (die Erklärung des Ausgabestroms ist zu kurz):

php://stdin

php://stdin, php://stdout und php://stderr ermöglichen den direkten Zugriff auf den entsprechenden Eingabe- oder Ausgabestream des PHP-Prozesses verweist auf einen doppelten Dateideskriptor. Wenn Sie also php://stdin öffnen und später schließen, schließen Sie nur Ihre Kopie des Deskriptors – der tatsächliche Stream, auf den STDIN verweist, ist davon nicht betroffen. Beachten Sie, dass PHP in dieser Hinsicht bis PHP 5.2 fehlerhaftes Verhalten zeigte .1. Es wird empfohlen, einfach die Konstanten STDIN, STDOUT und STDERR zu verwenden, anstatt Streams manuell mit diesen Wrappern zu öffnen.

php://stdin ist schreibgeschützt, während php://stdout und php ://stderr sind schreibgeschützt.

php://input

php://input ist ein schreibgeschützter Stream, der es Ihnen ermöglicht, Rohdaten aus dem Anfragetext einzulesen Im Fall von POST-Anfragen ist es vorzuziehen, php://input anstelle von $HTTP_RAW_POST_DATA zu verwenden, da es nicht von speziellen php.ini-Anweisungen abhängt. Darüber hinaus ist es in den Fällen, in denen $HTTP_RAW_POST_DATA nicht standardmäßig ausgefüllt ist, ein potenzielles Problem Weniger speicherintensive Alternative zur Aktivierung von „always_populate_raw_post_data“. php://input ist mit enctype="multipart/form-data" nicht verfügbar.

Das Dokument erklärt den Unterschied zwischen den beiden nicht direkt Der Vergleich kann die folgenden Informationen liefern: 1. Beide sind schreibgeschützte Streams. 2. php://stdin ist die Standardeingabe des PHP-Prozesses und php://input wird zum Lesen der Originaldaten des Anforderungshauptteils verwendet. Wie können wir anhand dieser Informationen die wesentlichen Unterschiede zwischen den beiden richtig verstehen?

Folgen Sie den Eingabeaufforderungen des php://stdin-Prozesses, verknüpfen Sie den Ausführungsprozess des PHP-Prozesses und kombinieren Sie ihn mit den Unterschieden in SAPI. Sie können die Hauptunterschiede zwischen den beiden ermitteln: php:/ /stdin ist der Eingabestrom des PHP-Prozesses. Daten können während des Ausführungslebenszyklus einfließen (z. B. interaktive Eingabe unter CLI). Im Allgemeinen können Daten nur dann einfließen, wenn PHP ausgeführt wird einmal lesen (Einzelheiten finden Sie in der Implementierung von SAPI). Auf die gleiche Weise können wir den Unterschied zwischen php://stdout und php://output ermitteln: php://stdout ist der Standardausgabestrom des PHP-Prozesses und php://output ist der zurückgegebene Ergebnisdatenstrom .

Der folgende Code wird verwendet, um die Schlussfolgerung zu überprüfen:

// file: test.php
file_put_contents("php://output", "message sent by output" . PHP_EOL);
file_put_contents("php://stdout", "message sent by stdout" . PHP_EOL);
print("message sent by print" . PHP_EOL);
 
echo "SAPI:" , PHP_SAPI , PHP_EOL;

Die Befehlszeilen-Ausführungsdatei, die Ausgabe lautet wie folgt:

message sent by output
message sent by stdout
message sent by print
SAPI:cli

Browserseitige Anfrage, die Ausgabe lautet wie folgt:

message sent by output
message sent by print
SAPI:fpm-fcgi

Unter der Befehlszeile Der Standardausgabestrom und der Ergebnisausgabestrom des PHP-Prozesses. Beide werden auf das Terminal verwiesen und alle Nachrichten werden gedruckt. Auf der Browserseite wird der Ausgabestrom des PHP-Prozesses ignoriert und nur der resultierende Datenstrom an den Webserver gesendet. Gleichzeitig werden die Informationen von Druck- und Echoaufrufen als Ausführungsergebnisse an den Ergebnisausgabestream gesendet, sodass sie normal angezeigt werden.

Abschließend möchte ich meine Wertschätzung für die Einfachheit und Praktikabilität der in PHP integrierten Funktionen zum Ausdruck bringen. Eine file_put_contents-Funktion kann den Stream-Schreibvorgang verarbeiten, und der Wechsel zu Java erfordert viel Stream-/Writer-Code erspart auch das umständliche fopen/fwrite/fclose im C-Stil.


Das obige ist der detaillierte Inhalt vonAnalysieren Sie den Unterschied zwischen php://output und php://stdout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn