2011-04-06 72 views
0

我正在研究一些PHP框架的PHP cli工具,並有一種情況下,我的腳本或者從文件讀取或STDIN。由於並非所有操作(如fseek())在STDIN上都有效,因此我正在尋找一種方法來檢測此問題。如何確定一個流是否是在STDIN PHP

+0

我不明白。當然,你必須知道你是否將stdin或標準文件傳遞給特定的函數?你的意思是你不知道'stdin'是否對應於一個TTY或一個正在傳入的文件? – 2011-04-06 20:12:52

+0

因爲'stdin'上的數據來自於tty或者關於尋找能力的文件並不重要,所以我相信他不需要一個相當於'isatty()'的PHP。我猜他有一個接受fd的函數,他希望使他的代碼具有通用性,因此可以使用常規文件和stdin。 – ThiefMaster 2011-04-06 20:19:02

+0

@ThiefMaster就是這樣。 – 2011-04-06 20:21:22

回答

4

原來,功能stream_get_meta_data()提供了一個解決方案,在標準的時候,結果是:

array(9) { 
    ["wrapper_type"]=> 
    string(3) "PHP" 
    ["stream_type"]=> 
    string(5) "STDIO" 
    ["mode"]=> 
    string(1) "r" 
    ["unread_bytes"]=> 
    int(0) 
    ["seekable"]=> 
    bool(false) 
    ["uri"]=> 
    string(11) "php://stdin" 
    ["timed_out"]=> 
    bool(false) 
    ["blocked"]=> 
    bool(true) 
    ["eof"]=> 
    bool(false) 
} 

所以,你可以做一個簡單的字符串的URI比較:

function isSTDIN($stream) { 
    $meta = stream_get_meta_data($stream); 
    return strcmp($meta['uri'], 'php://stdin') == 0; 
} 

該解決方案將工作流恆定STDIO是否被使用,或者舊fopen('php://stdin', 'r'),它仍然隱藏在舊代碼中。

1

只需選中if($fp === STDIN)

+0

我想到了這一點,但我正在使用舊的'fopen('php:// stdin..'語法,使比較失敗的遺留代碼。這應該工作,如果使用常量代替。 – 2011-04-06 20:17:21

相關問題