【问题标题】:Apache2 with PDF and PHP - "This file does not start with "%PDF-"带有 PDF 和 PHP 的 Apache2 -“此文件不以“%PDF-”开头
【发布时间】: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 阅读器。

标签: php pdf apache2 nginx


【解决方案1】:

这真的很难排除故障 - 对于初学者来说,(请原谅我的直言不讳,但是)这是管道不应该是什么样子的一个典型例子:

  • 三种不同的操作系统。
  • 可能至少有两个不同版本的 PHP。
  • 两个不同的网络服务器。

但无论如何,一些关于调试 PHP 的一般提示:

  • 确保在php.ini(设置display_errors = Off)中启用error_log和log_errors
  • 使用最冗长的error_reporting
  • 在 nginx 中设置 access_log 和 error_log。
  • 在 nginx 中提高日志级别(我猜你使用 php-cgi 或 php-fpm,所以你应该能够看到下载尝试失败时后端发出的状态)。

此外:

  1. 您尚未分享 PDF 的生成方式 - 您确定此处使用的所有库在所有系统中都相同或至少在某种程度上相同吗?
  2. 无论如何,只是为了确保在提供下载之前将 PDF 保存在服务器上。这使您可以对实际文件进行故障排除 - 以查看 PDF 生成是否确实有效。
  3. 由于您要保存 PDF,我会考虑将其放在 public 文件夹中,这样您就可以查看是否可以在它生成后重定向到它。只有这样可行,我才会进行强制下载之类的工作。
  4. 我会在所有阶段复制生产环境。 ;-) 您需要您的开发服务器与生产环境完全一样。对于您自己的工作站,我建议使用 VM(例如,通过带有 Ubuntu 10.10 的 Virtualbox)。

让我知道这可以帮助您到达某个地方并回复更新。 :-)

更新:

我会调查这两个标题:

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

绝对有助于缓存清除。

【讨论】:

  • 同意所有计数。第 2 点是清除 PDF 生成本身的任何问题的必须要做的事情。
  • 非常好的实用建议。同意@Ben - 第 2 点是您接下来要做的事情。 ++
  • 非常感谢 - Ecellent 的建议。选项 2 后跟选项 3 是我开发它的方式,因此可以切换回来。 PDF 是使用 ros.co.nz/pdf 版本 009 生成的,并且在所有机器上使用完全相同的代码。切换到 10.10 已在待办事项列表中 - 生产切换是由 2 周前的硬盘崩溃触发的。在生产环境中使用 Ubuntu 10:04 时,问题的发生率差不多。
  • 进一步更新: - 我已将测试服务更新为 ununtu 10:10,并花了很长时间试图让它失败。它工作得很好。使用 FF 我曾经遇到“图像数据不足”错误,保存文件,重复请求(有效)并比较生成的 .pdf 文件。他们是相同的。使用IE8的结果是PDF在新窗口中显示,旧窗口刷新但是当新/PDF窗口关闭时,弹出“IE已停止工作”。确认后,我收到“此标签已恢复”消息。
【解决方案2】:

这些是标题,最终在我的一个应用程序中以类似的情况工作:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header( "Content-Type: application/pdf" );
header("Content-Disposition: inline; filename=\"YourPDF_" . time() . ".pdf\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ". strlen( $pdfData ) );

我添加了 time() 代码以使文件名每次都更改,以便它可能通过所有代理。

问题有时但很少再次出现。然后,我们要求客户使用浏览器上下文菜单下载文件。

PS:该应用使用此处找到的 ezPDF:http://www.ros.co.nz/pdf/

【讨论】:

  • Stackoverflow 不知何故不允许我发表评论,所以我将标题添加到我的答案中。
  • 谢谢你,@Till。我会将您的标题添加到当前标题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多