写入流是成功的。但是stream_get_contents()返回空字符串

时间:2017-02-11 22:46:46

标签: php

我研究了使用PSR7创建自己的微框架的机会(不要问我为什么!)。所以我创建了简单的httpfoundation和模板组件。现在我正在测试我的这部分工作并遇到下一个问题。 我创建了Response对象:

public function __construct($statusCode = 200, $headers = null, $body = null)
    {
        $this->statusCode = $statusCode ? $statusCode : $this->checkedStatusCode($statusCode);
        $this->headers = $headers ? $headers : new Headers();
        $this->body = $body ? $body : new Stream(fopen('php://temp', 'w+'));
    }

视图已成功生成。然后我尝试在我的Response对象中编写它。 我的模板类中的代码

public function render(ResponseInterface $response, $template, array $data)
    {
        $output = $this->retrieve($template, $data);
        $response->getBody()->write($output);
        return $response;
    }

...和Stream类

public function write($string)
    {
        if (!$this->isWritable()) {
            throw new \RuntimeException('Could not write to stream');
        }

        $result = fwrite($this->stream, $string);
        if ($result === false) {
            throw new \RuntimeException('Could not write to stream');
        }

        return $result;
    }

我认为结果是成功的,因为$ result包含写入的字节数! 之后,我尝试使用Response class

中的方法dispatch()从Response对象中检索内容
public function dispatch()
    {
        return $this->getBody()->getContents();
    }

...和来自Stream类的方法getContents()

public function getContents()
    {
        if (!$this->stream) {
            throw new \RuntimeException("Stream is not readable");
        }

        $result = stream_get_contents($this->stream);
        if ($result === false) {
            throw new \RuntimeException("Error reading of stream");
        }

        return $result;
    }

我得到空字符串! 请帮我理解我丢失书面的身体!为什么我得到空弦! 谢谢你!

1 个答案:

答案 0 :(得分:0)

当写入 Stream 成功但 stream_get_contents($this->stream); 给你一个空字符串时,那么指针很可能没有设置到流的开头。可以通过多种方式将指针设置为开头。

可能性 1

// supply a maxlength, and offset
$contents = stream_get_contents($this->stream, -1, 0); 

可能性 2

rewind($this->stream);
$contents = stream_get_contents($this->stream); 

可能性 #3

fseek($this->stream, 0);
$contents = stream_get_contents($this->stream);