分析php://output和php://stdout的區(qū)別
PHP包含了以php://開頭的一系列輸出輸出流,如php://stdin, php://stdout等。今天查看代碼時(shí),忽然想到一個(gè)問題:php://output和php://stdout有什么區(qū)別?
從PHP的官方文獻(xiàn)中找答案,對輸入流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”.
文檔并未直接闡述兩者的區(qū)別,仔細(xì)對比可得出以下信息:1. 均是只讀流; 2. php://stdin是PHP進(jìn)程的標(biāo)準(zhǔn)輸入,php://input用來讀取請求正文的原始數(shù)據(jù)。通過這些信息,該如何正確認(rèn)識(shí)兩者的本質(zhì)區(qū)別?
順著php://stdin進(jìn)程輸入的提示,聯(lián)想PHP進(jìn)程的執(zhí)行過程,再結(jié)合SAPI的差異,可以得到兩者主要區(qū)別:php://stdin是PHP進(jìn)程的輸入流,執(zhí)行生命周期內(nèi)均可能有數(shù)據(jù)流入(例如CLI下的交互式輸入);php://input是PHP執(zhí)行時(shí)的外部輸入流,一般數(shù)據(jù)只能讀一次(具體看SAPI的實(shí)現(xiàn))。同理可得到php://stdout和php://output的區(qū)別:php://stdout是PHP進(jìn)程的標(biāo)準(zhǔn)輸出流,php://output是返回的結(jié)果數(shù)據(jù)流。
下面用代碼驗(yàn)證結(jié)論:
// 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;
命令行執(zhí)行文件,輸出如下:
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
在命令行下,PHP進(jìn)程的標(biāo)準(zhǔn)輸出流和結(jié)果輸出流均指向終端,所有消息都打印出來。在瀏覽器端,PHP進(jìn)程的輸出流被忽略,只有結(jié)果數(shù)據(jù)流被發(fā)送到web服務(wù)器。同時(shí),print和echo調(diào)用的信息都作為執(zhí)行結(jié)果發(fā)往結(jié)果輸出流,所以都正常顯示。
最后再感慨一下PHP內(nèi)置函數(shù)的簡潔實(shí)用,一個(gè)file_put_contents函數(shù)就搞定流寫入操作,換Java需要stream/writer一堆代碼,也省去C風(fēng)格的fopen/fwrite/fclose的繁瑣。
相關(guān)文章
php記錄代碼執(zhí)行時(shí)間(實(shí)現(xiàn)代碼)
本篇文章是對php記錄代碼執(zhí)行時(shí)間的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07PHP JSON格式數(shù)據(jù)交互實(shí)例代碼詳解
此前我寫了不少在PHP網(wǎng)站開發(fā)中應(yīng)用XML進(jìn)行數(shù)據(jù)交互的實(shí)例,這兩天通過PHP解析JSON并進(jìn)行交互的實(shí)例學(xué)習(xí)和了解了JSON在PHP中的應(yīng)用,感覺非常方便。2011-01-01PHP動(dòng)態(tài)生成指定大小隨機(jī)圖片的方法
這篇文章主要介紹了PHP動(dòng)態(tài)生成指定大小隨機(jī)圖片的方法,涉及PHP根據(jù)傳入?yún)?shù)動(dòng)態(tài)生成圖片的相關(guān)技巧,需要的朋友可以參考下2016-03-03深思 PHP 數(shù)組遍歷的差異(array_diff 的實(shí)現(xiàn))
還是部門無聊的考題,不過這次考的是 PHP 的能力。題目如下: 給你兩個(gè)分別有 5000 個(gè)元素的數(shù)組,計(jì)算他們的差集 -- 說白了也就是用 PHP 和你認(rèn)為最好的算法實(shí)現(xiàn) array_diff 的算法。初次接到這個(gè)題目,我發(fā)現(xiàn)這非常的簡單,于是按照以往的經(jīng)驗(yàn)“隨便”寫了一個(gè):2008-03-03php stripslashes和addslashes的區(qū)別
這篇文章主要介紹了php stripslashes和addslashes的區(qū)別,特分享下方便需要的朋友。2014-02-02thinkphp中U方法按路由規(guī)則生成url的方法
下面小編就為大家分享一篇thinkphp中U方法按路由規(guī)則生成url的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03php的webservice的wsdl的XML無法顯示問題的解決方法
本篇文章是對php的webservice的wsdl的XML無法顯示問題的解決方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03CI框架中通過hook的方式實(shí)現(xiàn)簡單的權(quán)限控制
這篇文章主要介紹了CI框架中通過hook的方式實(shí)現(xiàn)簡單的權(quán)限控制,需要的朋友可以參考下2015-01-01