Home >Backend Development >PHP Tutorial >Analyze the difference between php://output and php://stdout

Analyze the difference between php://output and php://stdout

不言
不言Original
2018-05-07 09:27:171604browse

This article gives you a detailed analysis of the usage differences between php://output and php://stdout as well as sample code sharing. Friends in need can refer to it.

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 (the explanation of the output stream is too brief):

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 can we correctly understand the essential differences 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 difference between the two: php://stdin is the input stream of the PHP process. Data may flow 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). In the same way, 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.

The following code is used 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;

The command line executes the file and 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

Under the command line, the standard output stream and result output stream of the PHP process are pointed 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. .


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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn