创建一个没有超时的长TCPDF文档(php进程运行时间太长)


Creating a long TCPDF document without timeout (so long running php process)

我正在构建一个网站的功能,该功能将生成一个PDF(使用TCPDF)到一本500多页的小册子中。布局非常简单,但由于记录的数量,我认为它符合"长时间运行的php进程"的条件。这每年只需要做几次,如果我能在后台运行它,并在完成后给管理员发电子邮件,那将是完美的。考虑Cron,但它是一种用户生成的功能类型。

我可以做些什么来保持我的PDF渲染尽可能长的时间?我对PHP很"在行",但对*nix不太在行。即使是教程链接也会有所帮助。

老实说,您应该完全从可伸缩性的角度避免这样做。我会使用一个数据库表来用参数"调度"作业,并有一个不断检查该表的脚本。然后使用JavaScript轮询您的应用程序,以确定文件是否"就绪",当文件就绪时,让JavaScript将文件拉到客户端。

当你想知道为什么我的网络服务器突然这么慢时,维护/解决这个过程将非常困难。Apache并不容易确定哪个进程占用了多少CPU。

此外,通过使用数据库,您可以限制并发线程的数量,甚至可以通过让多个进程渲染每个PDF页面来提供更快的渲染时间,然后将它们与另一个进程重新组装在一起。。。等

祝你好运!

您需要的是更改PHP脚本允许的最长执行时间。您可以通过脚本本身的几种方法(如果它能工作的话,您应该更喜欢这样)或通过更改php.ini来实现这一点

BEWARE-更改执行时间可能会严重降低服务器的性能。脚本在被解析器终止之前只允许运行一段特定的时间(默认为30秒)。这有助于防止写得不好的脚本占用服务器。在做这件事之前,你应该确切地知道自己在做什么。

你可以找到更多关于的信息

  • 在php.ini中设置max-execution-timehttp://www.php.net/manual/en/info.configuration.php#ini.max-执行时间
  • 此处通过set_time_limit()限制最大执行时间http://php.net/manual/en/function.set-time-limit.php

附言:如果你使用PHP生成PDF,这应该会起作用。如果您在脚本之外使用一些东西(由exec()system()等调用),它将不起作用。

这个问题已经得到了回答,但由于这里有其他问题/答案,以下是我所做的,效果很好:(我使用pdftk做了同样的事情,但规模较小!)

我把以下代码放在iframe中:

set_time_limit(0);                   // ignore php timeout
//ignore_user_abort(true);           // optional- keep on going even if user pulls the plug*
while(ob_get_level())ob_end_clean();// remove output buffers
ob_implicit_flush(true); 

这避免了页面加载超时。您可能希望在父页面上设置倒计时或进度条。我最初让iframe向父级发布进度更新,但浏览器更新打破了这一点。