我必须写一些东西来处理通过POST发送的XML文档。该文档内部有base-64编码的二进制文件,因此请求可能相当大。
如此:
$document = simplexml_load_file('php://input');
但是我正在使用Zend Diactoros PSR-7实现,所以我真的应该这样做:
$request = ZendDiactorosServerRequestFactory::fromGlobals();
$document = simplexml_load_file($request->getBody());
但是,这会导致流被强制转换为字符串,从而导致错误。
我真正需要的是:
$document = simplexml_load_file($request->getBody()->stream);
因为:
var_dump($request->getBody());
object(ZendDiactorosPhpInputStream)#5 (4) {
["cache":"ZendDiactorosPhpInputStream":private] => string(0) ""
["reachedEof":"ZendDiactorosPhpInputStream":private ] => bool(false)
["resource":protected] => resource(4) of type (stream)
["stream":protected] => string(11) "php://input"
}
但注意->stream
是受保护的。我应该扩展ZendDiactorosPhpInputStream
并编写一个公开->stream
的公共方法吗?还是有更好的办法?
请注意:我正在寻找一个基于流的解决方案;不将整个流作为字符串读入内存
我在GitHub repo上问。解决方案是将流资源与包装器对象分离。您可以不再使用包装器,但至少从框架中调用流资源,因此至少实现了一些解耦。
$request = ZendDiactorosServerRequestFactory::fromGlobals();
$stream = $request->getBody()->detach();
$metadata = stream_get_meta_data($stream);
$document = simplexml_load_file($metadata['uri']); // "php://input" is passed