我正在构建一个网站的功能,该网站将生成PDF(使用TCPDF)到500多页的小册子中。布局非常简单,但由于记录的数量,我认为它有资格作为“长时间运行的PHP进程”。这只需要每年完成几次,如果我可以让它在后台运行并在完成后通过电子邮件发送给管理员,那将是完美的。考虑过Cron,但它是用户生成的一种功能。
如果需要,我该怎么做才能保持PDF渲染?我对PHP很“好”但与* nix没那么多。即使是教程链接也会有所帮助。
答案 0 :(得分:3)
老实说,从可伸缩性的角度来看,你应该完全避免这样做。我使用数据库表来使用参数“调度”作业,有一个不断检查此表的脚本。然后使用JavaScript轮询应用程序以使文件“准备就绪”,当文件准备就绪时,让JavaScript将文件下拉到客户端。
当您想知道为什么我的网络服务器突然变得如此缓慢时,维护/解决此过程将非常困难。 Apache不容易确定哪个进程占用了什么CPU。
同样通过使用数据库,您可以执行诸如限制并发线程数量之类的操作,甚至可以通过让多个进程呈现每个PDF页面然后使用另一个进程将它们重新组合在一起来提供更快的渲染时间......等等。
祝你好运!答案 1 :(得分:1)
您需要更改PHP脚本允许的最长执行时间。您可以通过脚本本身的几种方式(如果它可以工作,您应该更喜欢它)或通过更改php.ini来实现。
警告 - 更改执行时间可能会严重降低服务器的性能。允许脚本在解析器终止之前仅运行一定时间(默认为30秒)。这有助于防止编写不良的脚本占用服务器。在你这样做之前,你应该完全知道你在做什么。
您可以找到更多信息:
max-execution-time
http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time set_time_limit()
exec()
system()
PS:如果您使用PHP生成PDF,这应该有效。如果您使用脚本之外的某些内容(由{{1}},{{1}}和类似名称调用),它将无效。
答案 2 :(得分:-1)
这个问题已经回答了,但是由于这里的其他问题/答案,这里是我做的并且效果很好:(我使用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发布进度更新回给父级,但是浏览器更新打破了这一点。