stream_copy_to_stream永远不会完成

时间:2014-11-08 14:16:31

标签: php put

我试图将文本保存到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中 - 脚本到目前为止运行正常但它从未到达关闭资源的行。

我在这里做错了什么?

1 个答案:

答案 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