首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Zend (PSR-7 StreamInterface)封装的流传递给fopen样函数?

将Zend (PSR-7 StreamInterface)封装的流传递给fopen样函数?
EN

Stack Overflow用户
提问于 2016-09-23 16:46:04
回答 1查看 493关注 0票数 0

我必须编写一些东西来处理通过POST发送的XML文档。文档中有基-64编码的二进制文件,因此请求可以相当大。

这样做是可行的:

代码语言:javascript
复制
$document = simplexml_load_file('php://input');

但是我使用的是ZendDiactorosPSR-7实现,所以我真的应该这样做:

代码语言:javascript
复制
$request  = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$document = simplexml_load_file($request->getBody());

但是,这会导致将流转换为字符串,从而导致错误。

我真正需要的是:

代码语言:javascript
复制
$document = simplexml_load_file($request->getBody()->stream);

因为:

代码语言:javascript
复制
var_dump($request->getBody());

object(Zend\Diactoros\PhpInputStream)#5 (4) {
  ["cache":"Zend\Diactoros\PhpInputStream":private] => string(0) ""
  ["reachedEof":"Zend\Diactoros\PhpInputStream":private ] => bool(false)
  ["resource":protected] => resource(4) of type (stream)
  ["stream":protected] => string(11) "php://input"
}

但是注意,->stream是受保护的。我应该扩展Zend\Diactoros\PhpInputStream并编写一个公开->stream的方法吗?还是有更好的方法?

请注意:我正在寻找基于流的解决方案,而不是将整个流作为字符串读入内存。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 11:38:46

我问在GitHub回购上。解决方案是将流资源与包装器对象分离。您不能再使用包装器,但是至少可以从框架中调用流资源,因此至少实现了一些解耦。

代码语言:javascript
复制
$request  = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$stream   = $request->getBody()->detach();
$metadata = stream_get_meta_data($stream);
$document = simplexml_load_file($metadata['uri']); // "php://input" is passed
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39665780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档