2014-11-08 2 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

Это потому, что поток stdin никогда не закрывается, а третий параметр - 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» будет записана в файл.

Чтобы это исправить, вы можете переписать так:

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

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

Как интересное примечание стороны в PHP 5.6 php://input is reusable

Или, когда в командной строке.

$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', как я использовал ... –

Смежные вопросы