2014-11-08 134 views
1

我試圖將文本保存到在PUT請求中發送的文件。這基本上是我使用的代碼(基於documentation):stream_copy_to_stream永遠不會結束

$content = fopen("php://stdin", "r"); 
    $fp = fopen($this->getFileName(), "w"); 
    stream_copy_to_stream($content, $fp); 

    fclose($fp); 
    fclose($content); 

每當我試圖把東西這個腳本,它只是始終運行。使用調試器,我發現問題在stream_copy_to_stream - 腳本運行良好,但從未到達關閉資源的線路。

我在這裏做錯了什麼?

回答

3

這是因爲標準輸入流不會關閉,第三個參數爲stream_copy_to_stram,默認設置爲讀取無限數量的字節。

<?php 
$reader = fopen("php://stdin", "r"); 
$writer = fopen("test.out", "w"); 
stream_copy_to_stream($reader, $writer); 

fclose($reader); 
fclose($writer); 

嘗試從命令行運行此命令。

// at this point it will block forever waiting on stdin 
$ php reader_writer.php 
Type something 
^C 

字符串「Type Something」將寫入文件。在PHP 5.6 php://input is reusable

或者當

$reader = fopen("php://input", "r"); 
$writer = fopen("test.out", "w"); 
while ($line = fgets($reader)) { 
    fwrite($writer, $line, strlen($line)); 
} 

fclose($reader); 
fclose($writer); 

作爲一個有趣的方面說明在命令行上:

爲了解決這個問題,你可以重寫。

$reader = fopen("php://stdin", "r"); 
$writer = fopen("test.out", "w"); 
while ($line = fgets($reader)) { 
    fwrite($writer, $line, strlen($line)); 
} 
fclose($reader); 
fclose($writer); 

然後運行

$ echo "sdfsdaf" | php read_write.php 
+0

你說得對!它在文檔中說'php:// input',而不是'php:// stdin',因爲我用... – 2014-11-08 14:54:49

相關問題