【问题标题】:How to generate Chunked response with a Trailer in Apache/PHP?如何在 Apache/PHP 中使用 Trailer 生成块响应?
【发布时间】:2012-08-05 21:15:34
【问题描述】:

我知道我可以在 PHP 中生成分块响应,只需在输出中引入 sleep()

但是是否也可以在 PHP 中生成 Trailer HTTP 部分?如果没有,在 Apache 2.2 中是否有可能?

我需要它来进行测试。

【问题讨论】:

  • 我会说,除非被证明是错误的,否则您应该能够回显出您需要的任何内容。确保在开始分块响应正文之前设置了所有需要的真实响应标头。还要确保请求是 HTTP/1.1 并且支持分块传输编码。这对于 CGI/FCGI 应该是透明的。
  • 我找不到如何从 CGI 提供 HTTP 预告片。在双换行符之后 CGI 输出的任何内容都被 Apache 视为响应体。
  • 是的,但是按照规范,分块的响应仅在响应正文中,所以这应该不是问题。还是我看错了规格?
  • @hakre 虽然您在语义上是绝对正确的,但响应正文和预告片在输出方式方面没有区别,因为 Apache 正在处理分块,您需要以某种方式解释这些最后几行数据是预告片,而不仅仅是另一块。预告片应该跟在最后一个长度为 0 的块之后。 AFAIK 没有办法做到这一点。我唯一能想到的就是改变 Apache 中处理分块的任何机制,并在您的 PHP 脚本中手动实现。这是可能的,但一个巨大的 PITA...
  • 您想要完成什么需要分块响应?

标签: php apache http chunked-encoding


【解决方案1】:

如果发送了标头并且没有指定Content-Length 标头,PHP 将默认发送分块响应。如果您熟悉 HTTP 规范,这是唯一合乎逻辑的做法,因为另一端的客户端需要知道您发送的 HTTP 消息何时结束,以便停止读取。

如果您想手动执行此操作,您需要...

  1. 自己发送相应的标头并致电flush()
  2. 手动输出分块的 HTTP 消息

因此,您可能会执行以下操作。这个想法是您需要手动发送自己的标头并手动分块您自己的消息。但是,如果您根本不发送 Content-Length 标头,PHP 将默认为您发送分块消息。

header("Transfer-encoding: chunked");
header("Trailer: X-My-Trailer-Header");
flush();

echo dechex(strlen($myChunk)) . "\r\n";
echo $myChunk;
echo "\r\n";
flush();

echo "0\r\n";
flush();

echo "X-My-Trailer-Header: some-value\r\n";
flush();

【讨论】:

  • 模拟分块流不是我想要的,当然我可以按照规范自己模拟它。但我真正想要的是针对保证正确的真实响应测试我的代码。对我来说,这是一件心事。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2016-08-31
  • 2011-05-04
  • 2017-02-08
相关资源
最近更新 更多