ホームページ  >  記事  >  バックエンド開発  >  php://output と php://stdout の違い

php://output と php://stdout の違い

藏色散人
藏色散人転載
2019-08-26 14:12:122313ブラウズ

PHP には、php://stdin、php://stdout など、php:// で始まる一連の出力ストリームが含まれています。今日コードを見ていて、突然疑問が生じました。php://output と php://stdout の違いは何ですか?

PHP の公式ドキュメントから答えを見つけてください。入力ストリーム php://stdin および php://input の説明は次のとおりです (出力ストリーム 単純すぎる):

php://stdin
php://stdin, php://stdout and php://stderr allow direct access to the corresponding input or output stream of the PHP process. The stream references a duplicate file descriptor, so if you open php://stdin and later close it, you close only your copy of the descriptor-the actual stream referenced by STDIN is unaffected. 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.
php://stdin is read-only, whereas php://stdout and php://stderr are write-only.
php://input
php://input is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to use php://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where $HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. php://input is not available with enctype="multipart/form-data".

このドキュメントでは、2 つの違いについて直接説明していません。注意深く比較すると、次の情報が得られます:

1. どちらも読み取り専用ストリームです。

2 .php://stdin は PHP プロセスの標準入力であり、php://input はリクエスト本文の元のデータを読み取るために使用されます。

この情報を基に、この 2 つの本質的な違いを正しく理解するにはどうすればよいでしょうか?

php://stdin プロセスの入力プロンプトに従い、PHP プロセスの実行プロセスを関連付け、それを SAPI の違いと組み合わせると、2 つの主な違いがわかります。

php://stdin は、PHP プロセスの入力ストリームには、実行ライフサイクル中にデータが流入する可能性があります (CLI での対話型入力など)。

php://input は外部入力です。 PHP の実行時にストリームを取得します。通常、データは 1 回だけ読み取ることができます (詳細については、SAPI の実装を参照してください)。

同様に、php://stdout と php://output の違いを取得できます。php://stdout は PHP プロセスの標準出力ストリームであり、php://output は返されるストリームです。結果データストリーム。

以下のコードを使用して結論を​​確認します。

// 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;

コマンド ライン実行ファイル、出力は次のとおりです。

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

ブラウザ側リクエスト、出力は次のとおりです。

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

In コマンド ラインでは、PHP プロセスの標準出力ストリームと結果出力ストリームが端末に送信され、すべてのメッセージが出力されます。ブラウザ側では、PHP プロセスの出力ストリームは無視され、結果のデータ ストリームのみが Web サーバーに送信されます。同時に、print 呼び出しと echo 呼び出しの情報が実行結果として結果出力ストリームに送信されるため、正常に表示されます。

最後に、PHP の組み込み関数のシンプルさと実用性に感謝の意を表したいと思います。1 つの file_put_contents 関数でストリームの書き込み操作を処理できます。Java に変更するには、多くのストリーム/ライター コードが必要です。また、面倒な C スタイルの fopen/fwrite/fclose も省略できます。

推奨チュートリアル: PHP ビデオ チュートリアル

以上がphp://output と php://stdout の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。