【问题标题】:PHP/Apache blocking on each request?PHP / Apache阻塞每个请求?
【发布时间】:2009-01-10 08:37:04
【问题描述】:

好的,这可能是一个愚蠢的问题,但这里是。前几天,当我在 PHP 中使用不同的 HTML 到 PDF 转换器时,我注意到了一些事情。我尝试过的一个(dompdf)花了很长时间才能在我的 HTML 上运行。最终它耗尽了内存并结束了,但当它仍在运行时,我的其他 PHP 脚本都没有响应。就好像一个请求阻塞了整个 Web 服务器。

现在我假设这不可能是正确的,或者我应该在某个地方设置一些东西来控制这种行为。有人可以帮我介绍一下吗?

【问题讨论】:

  • dompdf 非常敏感 - 确保您拥有有效的 html 并尽量减少嵌套(尤其是表格)
  • 在最新的 PHP (5.2.8) 中也有一个 bug,它可以使 dompdf 中的 apache 段错误:bugs.php.net/bug.php?id=44182
  • 我的 HTML 中有一些错误,但我修复了它们,现在我通过 HTML Tidy 运行它来修复错误(根据 W3C 验证器,它在 Tidy 之后验证为 0 个错误)并且 dompdf 仍然阻塞它。我目前正在研究 html2ps/html2pdf 作为替代方案。

标签: php apache


【解决方案1】:

您是否为每个脚本打开了会话?:) 他们可能会重复使用相同的会话,并且会阻塞直到会话被最后一个请求释放...所以他们基本上等待对方完成(在您的情况下)长期运行的 pdf 生成器)。这仅适用于您使用相同的浏览器。

提示,不确定为什么要将 html 转换为 pdf,但您可以查看 FOP http://xmlgraphics.apache.org/fop/ 以生成 PDF。我正在使用它并且效果很好..而且速度很快:) 不过它确实有它的怪癖。

【讨论】:

  • 我正在从 HTML 片段构建一个文档,所以它就是 HTML。 XML (FO) 对我没有好处。我没有意识到会话访问被阻止。我认为这就是问题所在。我想我认为它们像 Java 会话一样工作(假设这样的事情总是很危险的)。
【解决方案2】:

可能是您尝试的所有脚本都在同一个应用程序池中运行。 (至少,它在 IIS 中是这样称呼的。)

但是,另一种解释是某些浏览器会通过单个连接对请求进行排队。这让我在过去有些困惑。如果您的 Web 浏览器正在等待 yourdomain.com/script1.php 的响应,并且您打开另一个窗口或选项卡到 yourdomain.com/script2.php,则该请求将不会被发送,直到第一个请求收到回复使其 似乎你的整个网络服务器都挂了。一个简单的测试方法是在两个不同的浏览器上尝试两个请求。

【讨论】:

    【解决方案3】:

    听起来服务器只是不堪重负并且负载过大而无法完成请求。将 HTML 文件转换为 PDF 是一个相当复杂的过程,因为 PHP 脚本必须有效地提供与 Web 浏览器相同的功能并使用 PDF 绘图功能呈现 HTML。

    我建议您将 HTML 拆分为单独的较小文件,或者直接通过 PHP 独立于服务器将脚本作为计划任务运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2021-11-14
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多