当前位置: 首页 > 后端技术 > PHP

php---output和php---stdout的区别

时间:2023-03-29 21:48:03 PHP

转载请注明文章出处:https://tlanyan.me/php-output...PHP包含一系列php开头的输出://输出流,如php://stdin、php://stdout等。今天看代码的时候突然想到一个问题:php://output和php://stdout有什么区别?从PHP的官方文档中寻找答案。输入流php://stdin和php://input的解释如下(输出流的解释太简略):php://stdinphp://stdin,php://stdout和php://stderr允许直接访问PHP进程的相应输入或输出流。该流引用了一个重复的文件描述符,因此如果您打开php://stdin然后关闭它,您只关闭了描述符的副本——STDIN引用的实际流不受影响。请注意,在PHP5.2.1之前,PHP在这方面表现出错误行为。建议您只使用常量STDIN、STDOUT和STDERR而不是使用这些包装器手动打开流。php://stdin是只读的,而php://stdout和php://stderr是只写的。php://inputphp://input是只读流,允许您从中读取原始数据请求体。对于POST请求,最好使用php://input而不是$HTTP_RAW_POST_DATA,因为它不依赖于特殊的php。ini指令。此外,对于那些默认情况下未填充$HTTP_RAW_POST_DATA的情况,它可能是激活always_populate_raw_post_data的一种内存密集度较低的替代方法。php://input不适用于enctype="multipart/form-data"。Documentationand两者的区别就不直接说明了,仔细对比可以得到以下信息:1.都是只读流;2、php://stdin是PHP进程的标准输入,php://input是用来读取请求文本Rawdata的,通过这些信息,如何正确理解两者的本质区别?按照php://stdin进程输入的提示,联想PHP进程的执行流程,结合SAPI的不同,可以得出两者的主要区别:php://stdin是PHP的输入流进程,并且执行生命周期内有可能有数据流入(比如CLI下的交互输入);php://input是PHP执行时的外部输入流,一般数据只能读取一次(详见SAPI的实现)。同理可以得到php:??//stdout和php://output的区别:php://stdout是PHP进程的标准输出流,php://output是返回的结果数据流.下面的代码验证了结论://file:test.phpfile_put_contents("php://output","messagesentbyoutput".PHP_EOL);file_put_contents("php://stdout","messagesentbystdout".PHP_EOL);print("messagesentbyprint".PHP_EOL);echo"SAPI:",PHP_SAPI,PHP_EOL;命令行执行文件,输出如下:messagesentbyoutputmessagesentbystdoutmessagesentbyprintSAPI:cli浏览器端请求,输出如下:messagesentbyoutputmessagesentbyprintSAPI:fpm-fcgi命令行下,标准输出PHP进程的stream和result输出流指向终端,打印出所有消息。在浏览器端,PHP进程的输出流被忽略,只有结果数据流被发送到Web服务器。同时将print和echo调用的信息作为执行结果发送到result输出流,所以正常显示。最后,感受一下PHP内置函数的简洁实用。file_put_contents函数可以处理流写入操作。改成Java需要一堆stream/writer代码,也免去了C风格fopen/fwrite/fclose的繁琐。参考http://php.net/manual/en/wrap...