【问题标题】:PHP response mixed with previous response and output as plain textPHP 响应与之前的响应混合并以纯文本形式输出
【发布时间】:2026-01-16 20:15:01
【问题描述】:

我们使用 DomPDF 运行 Apache 2.2.16 和 PHP 5.3.3 来生成 PDF。生成 PDF 后,后续请求偶尔会返回纯文本响应,其中部分包含用于生成 PDF(即来自先前请求)的 HTML,以及 HTTP 标头和请求页面的响应。

Apache 以某种方式将对先前请求的部分响应与新响应混合在一起。这似乎是一个输出缓冲问题,尽管我无法使用相同的代码在本地复制它。它似乎也与 gzip 无关,因为禁用它仍然会出现问题。我也在 Firefox 和 Chrome 中进行了尝试,并获得了相同的结果。

更新:如果我关闭 keep-alive,它可以解决问题。但是,我不一定要保持活动状态。输出缓冲区或响应没有被清除显然仍然存在潜在问题。

以下是请求标头:

Request URL:https://asdf.com/checkout/5d86a9bdf455cdfd334494183559bf
Request Method:GET
Status Code:200 OK
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:APP=636c8e6b58e991476ed7d38849bde0d4; _
Host:asdf.com
Referer:https://asdf.com/get_pdf/33711
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.34 Safari/536.11

以及浏览器中显示的截断响应:

<!-- truncated HTML from the previous page (i.e. PDF) -->
    </p>
</div>


</body>
</html>HTTP/1.1 200 OK
Date: Tue, 19 Jun 2012 18:06:13 GMT
Server: Apache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 6457
Keep-Alive: timeout=7, max=96
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

‹í]ksÛ¸’ýìü
ŒfvmׯzP/?µëØNâÄI<‘’ìL*å‚HHBD
Z–gæ¿o7@I-BNrkë~ÐÜ;c‰<xtŸF£›lŠÇ¿œ¿;ëüq}Aj’ëÏ®.ÏHa¯TúT=+•Î;çä_vÞ\‘J±L:’F1W\D4,•.ÞHa Ôø°TšL&ÅIµ(d¿Ôy_ºÃ¾*Ø8ý¸§¬–Å@…Ö“c=àÝ(Œâ“ÝTLke4h=Ù:V\…¬õ{"‹Éßä2RLR_ñ[FN}_$‘âQÿ¸d`€1E  v¾Ç¾%üö¤p& I¤ö:Ó1+ß|;)(v§J8ØñTÆL$ª··_ ¥ÖqìK>VDA“ù•ÞRs´@bé›ùÇ ýJïŠ}!ú!£c}1ÒÇJ!ïÆ¥¯ß&§¥J±™~,ŽxTüZÇ
<!-- followed by a bunch more gzipped gibberish -->

【问题讨论】:

    标签: php apache http-headers


    【解决方案1】:

    这听起来确实像是网络服务器的问题,部分原因是keep-alive 连接。可能的补救措施:

    • 如果您尚未发送带有 PDF 的 Content-Length 标头,请发送。另外,确保Content-Length正确:即:之后没有更多的输出。
    • 在 apache 中禁用 KeepAlive。问题是,据我所知,这不能在每个请求甚至每个目录的基础上完成,所以这意味着如果为您禁用整个站点(不推荐),或者从不同的虚拟主机提供 pdf。

    我的偏好肯定如果解决了第一个选项,第二个很麻烦。

    【讨论】:

    • 哇,在您发布此内容之前,我们刚刚添加了与 keep-alive 相关的更新 :) i
    • 已经设置了 Conte-Length 标头(看起来是正确的,因为大小与 PDF 的大小相匹配)。还有其他想法吗?我唯一的另一个想法是将keep-alive超时设置为1。它不会完全解决问题,但除非您在收到响应后立即发出另一个请求,否则不会发生......嗯......
    • 嗯,但是有 HTML 输出。难道Content-Length实际上是不正确并且在提到的字节之后生成/发送了更多输出(即:一些小错误在发送pdf后生成更多输出)?
    • 你说得对,CakePHP 试图在 PDF 输出发送后渲染视图。我在流式传输 PDF 后立即添加了一个退出调用,这解决了这个问题。感谢您的帮助!
    • 很高兴能提供帮助。这种“不正确的内容长度会产生奇怪的输出”——知识有一天可能会派上用场;)