【发布时间】:2011-04-17 14:19:33
【问题描述】:
几周以来,我一直在努力寻找导致此错误的原因 - 但我发现了一个空白。系统使用 PHP 生成动态 .pdf 文件。
我有三台服务器:Dev(Win7 和 Apache2)、Test(Ubuntu 10.4 和 nginx)和 Live(Ubuntu 10.10 和 nginx)。所有人都在运行 php5 和我开发的系统 - 相同的代码。等效,相同的配置。
我有很多浏览器测试过:DevIE (win7, IE8), DevFF (Win7 Firefox 3.5), DevSaf (win, Safari), LaptopFF (WinXP, Firfox 3.5), Laptop IE(WinXP, IE8 Test ( Ubuntu FF3.5) 和用户(主要是 Win 7 和 Win XP 上的 IE8)。
- 当我从 Test 生成 PDF 时,它在所有浏览器中都能正常工作(我无法测试的用户除外)。
- 当我从 Dev 生成 PDF 时,它在 DevIE、DevFF 和 DevSaf 中失败,但从 Test 调用它可以正常工作。
- Apache2 总是在同一台机器上失败。
- 在笔记本电脑上,使用 FF 成功,使用 IE8 失败(见下文)。
用户报告间歇性问题。它失败了,然后重复请求并成功。
当它失败时......
显示生成的 PDF 的日志,发送大小正确的回复(500KB 到 1.8MB),结果为 200 OK。这是有时,大约 10 秒后重复相同的 URL - 但这会生成登录屏幕(再次 200 OK 回复),但大小只有 2K。这意味着它是在没有 cookie 的情况下请求的。
Adobe Reader 尝试显示登录页面,并带有不可避免的"This file does not start with "%PDF-" 错误消息。
除了当我尝试使用笔记本电脑和 IE8 时 - 然后它失败,显示源显示一个 4 行的 html 文件,正文为空!
该系统已经运行了一年多,直到大约 2 个月前更换生产服务器才开始出现故障。此时测试版本没有更改,但也开始失败。
我尝试了各种标题,但我尝试过的没有任何区别。当前的标题集是:
header('Content-Disposition: inline; filename="'.$this->pdfFilename().'"');
header('Content-type: application/pdf');
header("Pragma: public");
$when = date('r',time()+20); // expire in 20 seconds
header("Expires: $when");
我尝试用附件替换内联。添加和删除各种无缓存标头。一切都无济于事。
通过 JavaScript 在新窗口中请求 PDF - 并在 8 秒后刷新。我在没有新窗口的情况下进行了测试,也没有刷新 - 没有变化。
我有几个(小)由开发服务器提供的 PDF。所以我提出了我能想到的所有限制。现在总是失败。
所以我有一个 Windows Apache2.2 服务器,当从同一台机器浏览时失败,而在 Firefox 中从其他机器浏览时成功。
除了浏览器之外,不涉及代理或缓存机制。
有人对可能出现的问题有任何想法吗?正如我所说,我已经测试和消除了近 4 周的时间,断断续续,我什至还没有确定失败的组件。
【问题讨论】:
-
更多输入。从我妻子的 Win7 机器上测试了开发服务器 - 一切正常。它看起来好像与 64 位 Windows 7 有关。
-
是def headers导致问题还是代码的pdf生成部分有问题?
-
在Linux使用FF浏览,32位Windows 7使用FF和IE8浏览,服务器为nginx和fast-cgi时,PDF内容正确。所以我认为这是正确的。如果标题错误,它将永远无法工作。为什么/10 秒后重复日志来自哪里? PDF 在显示时实际上需要 1 到 2 秒来生成和提供服务 - 但在失败时需要 10 秒才能失败。还是很疑惑。
-
大约一年前我遇到过这样的问题。当某些用户从 Internet 切换到我们公司的 Intranet 时,问题突然出现。在服务器端,一切都按预期工作。没有错误日志条目。 PDF 肯定已移至客户端。我通过发送额外的标题来修复它。明天,我会尝试找到 HTTP hesder 集。
-
啊,在这里,一切正常,因为我们要求受感染的用户右键单击 PDF 链接并下载文件 - 然后启动 PDF 阅读器。