我必须编写一些东西来处理通过POST发送的XML文档。文档中有基-64编码的二进制文件,因此请求可以相当大。
这样做是可行的:
$document = simplexml_load_file('php://input');但是我使用的是ZendDiactorosPSR-7实现,所以我真的应该这样做:
$request = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$document = simplexml_load_file($request->getBody());但是,这会导致将流转换为字符串,从而导致错误。
我真正需要的是:
$document = simplexml_load_file($request->getBody()->stream);因为:
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的方法吗?还是有更好的方法?
请注意:我正在寻找基于流的解决方案,而不是将整个流作为字符串读入内存。
发布于 2016-10-07 11:38:46
我问在GitHub回购上。解决方案是将流资源与包装器对象分离。您不能再使用包装器,但是至少可以从框架中调用流资源,因此至少实现了一些解耦。
$request = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$stream = $request->getBody()->detach();
$metadata = stream_get_meta_data($stream);
$document = simplexml_load_file($metadata['uri']); // "php://input" is passedhttps://stackoverflow.com/questions/39665780
复制相似问题