stream_copy_to_stream никогда не заканчивается

Я пытаюсь сохранить текст в файл, который был отправлен в запрос PUT. Это в основном код, который я использую (на основе документация):

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

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

Всякий раз, когда я пытаюсь положить что-то в этот скрипт, он работает вечно. Используя отладчик, я обнаружил, что проблема в stream_copy_to_stream — скрипт до этого момента работает нормально, но никогда не достигает строк, где закрывает ресурсы.

Что я здесь не так делаю?

1

Решение

Это потому что поток 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

Строка «Введите что-то» будет записана в файл.

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

$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: // ввод можно использовать повторно

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

$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
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]