DomPDF渲染大型HTML文件导致500错误

时间:2013-03-25 08:33:56

标签: php dompdf

我正在使用最新版本的DomPDF(0.6.0 beta 3)。

PHP版本是5.2.17。

不幸的是,我在共享主机帐户上并升级PHP并且类似的操作不可用。我也无法访问apache错误日志,我认为这不会对你有用。

我已将PHP的memory_limit设置为2048M,将max_execution_time设置为999。虽然我不知道他们是否已经生效。我认为它们实际上并不重要,因为我觉得DomPDF没有超时或耗尽内存。 500错误似乎发生在请求页面后10秒,当我尝试生成一个页面较少的PDF时,脚本需要更长时间(12-15秒)但成功结束。

我有一个72.3kb的HTML文件,只有一个小的HTML表格。 (事实上​​,删除带有表格的页面无助于解决问题。)PDF应该会产生大约35页。

经过大量挖掘后,我发现错误发生在30号到第31页,page_frame_reflower.cls.php函数内reflow内的以下代码行:

  // Render the page
  $this->_frame->get_renderer()->render($child);

当每个循环(页面)上echo memory_get_usage时,值保持相当一致,低于可用内存的5%,似乎。

get_class上使用$this->_frame->get_renderer()我能够确定问题函数是Renderer::render()

不幸的是,我没有简单的方法继续使用我当前的方法进行调试。方法Renderer::render()不允许我将参数变量添加到参数中,因为它需要与它的父函数兼容。

任何人都对我有任何帮助,你看到我遗失的任何东西 - 你能指出我正确的方向来解决这500个错误吗?

编辑:我已从HTML文档中删除了内联PHP的所有用法,但似乎没有任何改变。

编辑2:文档太大而无法完全通过Tidy,但最多50000字节没有错误。

编辑3: PHP错误日志记录已打开。我可以通过调用错误的方法名称和其他东西来生成错误。这些错误出现在屏幕上。实际上,即使我在问题方法之前导致无限循环,我也会得到PHP最大执行时间到达屏幕上的错误。但问题区域显示500内部服务器错误页面。

编辑4:我删除了所有CSS,并且生成的PDF没有样式。现在我们到了某个地方。我将慢慢添加CSS,我可以缩小问题代码的范围。谢谢,@ Liv。

编辑5:我将CSS缩小到问题的萌芽:h1规则。我在h1标​​签上使用了背景图片。所以从我原来的问题来看,我所要做的就是从h1标签中删除背景图像,以使PDF正常工作。使用背景图像处理很多元素是DomPDF的一个问题吗?

编辑6:以下是HTML文件:http://www.pickering-mcaloon.com/wp-content/uploads/2013/03/test2.html我不得不删除内容(不是我的)。我用DomPDF测试了这个版本的HTML并得到了500个服务器错误。我的标题图片是25.1 kb。应该注意的是,每个页面的页脚也使用背景图像,它工作正常。在HTML的这个副本中,删除1个“章节”部分允许DomPDF完成生成PDF。

编辑7:当我第一次遇到问题时,我使用了memory_get_usage并在调用Renderer::render()的循环顶部,每次显示一个不同的用法,但低于最大值的6%,设置为2048M。我不相信这个问题是超时错误或内存错误,因为我可以在调用render之前产生这些类型的错误并将PHP错误打印到屏幕上。此外,运行约10秒后出现500错误 - 当PDF工作时,大约需要15-20秒。所以暂停不太可能。内存错误,或许如果是这样,为什么不打印错误,如果内存在调用render之前溢出。

编辑8:我将用作h1标签的背景图像的图像从PNG转换为JPG,将其大小从25.1kb缩小到2.6kb并正确生成PDF 。这可能是一个内存问题。 PHP应该生成一个错误并显示给我,但事实并非如此。

4 个答案:

答案 0 :(得分:1)

我面临的同样问题仍在继续。我正在使用Dompdf并尝试转换仅33KB的HTML页面,但我得到500内部服务器错误。

我的html页面下有多个外部样式表,包括bootstrap css。但是当我删除bootstrap css时,dompdf工作正常。

删除此行可能会对您有所帮助 - >链接类型=" text / css"的rel ="样式表" HREF =" /bootstrap.css"

但我不知道应该怎么做才能将Bootstrap.css包含到dompdf以及为什么bootstrap样式会导致dompdf出错。

答案 1 :(得分:0)

通常,当内存限制低于所需的内存时,就会发生此问题。

例如,这些增加了: ini_set(“ memory_limit”,“ 800M”); ini_set(“ max_execution_time”,“ 800”);

注意:在实例化类$ dompdf = new DOMPDF();

之前,请执行此操作

在此处根据需要设置memory_limit或max_execution_time。

答案 2 :(得分:0)

我过去曾使用DOMPDF从HTML代码生成PDF。 我也面临同样的问题。 经过许多天的苦苦挣扎,我才知道dompdf仅用于3至4页的小文档,这是一个大概的数字。 Dompdf非常适合基于CSS 2的样式,并且可以逼真地呈现。 但是它不支持大页面转换,如果您将大页面转换为pdf,则将花费太多时间并卡住或抛出500错误。 如果您的html中有简单的呈现数据,我建议您使用TCPDF。 另一种选择是使用wkhtmltopdf扩展名,该扩展名可以安装在linux服务器上并仅通过告诉url进行转换,它将为您转换完全相同的PDF。

以下是一些链接:

https://tcpdf.org/
https://wkhtmltopdf.org/
https://github.com/mikehaertl/phpwkhtmltopdf
https://stackoverflow.com/questions/5663814/how-do-i-get-wkhtmltopdf-to-execute-via-php

答案 3 :(得分:0)

我只有2美分(由于我的代表少于50名,因此无法在OP中发表评论,对不起)。 经历了几个小时的痛苦之后,检查了Apache日志(doh!),令我惊讶的是:

PHP Fatal error:  Uncaught exception 'Exception' with message 'The PHP GD extension 
is required, but is not installed.' in \\wwwroot\\app\\dompdf070\\lib\\Cpdf.php:4965

启用GD扩展解决了我的问题。

您可以在PHP.INI中取消注释该行

extension=php_gd2.dll