Я пытаюсь сохранить текст в файл, который был отправлен в запрос 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
— скрипт до этого момента работает нормально, но никогда не достигает строк, где закрывает ресурсы.
Что я здесь не так делаю?
Это потому что поток 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
Других решений пока нет …