我试图将文本保存到PUT请求中发送的文件中。这基本上就是我使用的代码(基于documentation):
$content = fopen("php://stdin", "r");
$fp = fopen($this->getFileName(), "w");
stream_copy_to_stream($content, $fp);
fclose($fp);
fclose($content);
每当我尝试将某些内容输入此脚本时,它就会永远运行。使用调试器我发现问题出现在stream_copy_to_stream
中 - 脚本到目前为止运行正常但它从未到达关闭资源的行。
我在这里做错了什么?
答案 0 :(得分: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