Home  >  Article  >  Backend Development  >  The difference between php://output and php://stdout

The difference between php://output and php://stdout

藏色散人
藏色散人forward
2019-08-26 14:12:122312browse

PHP includes a series of output streams starting with php://, such as php://stdin, php://stdout, etc. When I was looking at the code today, a question suddenly occurred to me: What is the difference between php://output and php://stdout?

Find the answer from PHP's official documentation. The explanations of the input streams php://stdin and php://input are as follows (explanation of the output stream Too simple):

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".

The document does not directly explain the difference between the two. A careful comparison can yield the following information:

1. Both are read-only streams;

2 .php://stdin is the standard input of the PHP process, and php://input is used to read the original data of the request body.

With this information, how to correctly understand the essential difference between the two?

Follow the input prompts of the php://stdin process, associate the execution process of the PHP process, and combine it with the differences in SAPI, you can get the main differences between the two:

php://stdin is The input stream of the PHP process may have data flowing in during the execution life cycle (such as interactive input under CLI);

php://input is the external input stream when PHP is executed. Generally, data can only be read. Once (see the implementation of SAPI for details).

Similarly, we can get the difference between php://stdout and php://output: php://stdout is the standard output stream of the PHP process, and php://output is the returned result data stream.

Use the code below to verify the conclusion:

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

Command line execution file, the output is as follows:

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

Browser side request, the output is as follows:

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

In Under the command line, the standard output stream and result output stream of the PHP process are directed to the terminal, and all messages are printed. On the browser side, the output stream of the PHP process is ignored, and only the resulting data stream is sent to the web server. At the same time, the information of print and echo calls are sent to the result output stream as execution results, so they are displayed normally.

Finally, I would like to express my appreciation for the simplicity and practicality of PHP's built-in functions. One file_put_contents function can handle the stream writing operation. Changing to Java requires a lot of stream/writer code, and also saves the cumbersome C-style fopen/fwrite/fclose. .

Recommended tutorial: PHP video tutorial

The above is the detailed content of The difference between php://output and php://stdout. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete