0

我必须编写一些东西来处理通过 POST 发送的 XML 文档。该文档内部包含 base-64 编码的二进制文件,因此请求可能非常大。

这有效:

$document = simplexml_load_file('php://input');

但我正在使用 Zend Diactoros PSR-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吗?或者,还有更好的方法?


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

4

1 回答 1

0

在 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 passed
于 2016-10-07T11:38:46.357 回答