首页 > 解决方案 > 从 MYSQL DB 生成 PDF 报告,循环遍历大量数据而不会超时 PHP

问题描述

我需要一些关于问题/实施的建议。所以我的平台有一个页面,用户可以在其中下载所有添加数据的 PDF 报告。数据下载到表格布局中并进行分页等,并且在每个页面的底部都有总计,前一页的总计和从图片中单独添加的数据中获取的总计。现在,当用户可能有 5000 多个条目时会出现问题,这将生成近 1000 页的 pdf 报告。对于每个新页面(计数器系统),然后发生多个查询以获取该特定页面的相关数据。如果用户确实有 5000 多条记录,那么服务器将在 45 秒后返回 NGINX 404 not found 错误。

所以我想知道我可以尝试什么来阻止这种情况发生,我尝试在所有查询周围添加 usleep() 以阻止它向数据库发送垃圾邮件,但这似乎不起作用。托管在 AWS 上

我知道关于位的信息不多,如果需要可以添加更多信息

谢谢

在此处输入图像描述

标签: phpmysqlamazon-web-services

解决方案


如果请求需要很长时间才能响应(老实说,在网络术语中,任何超过几秒的时间都是“很长的时间”,任何可能超过 30 秒的时间都是永恒的),那么它不应该在原地完成这页纸。相反,将实际处理卸载到其他东西。

考虑一个用户“排队”要生成的报告的系统。这不仅仅是将记录写入数据库表。快速、简单地向用户提供反馈,告诉他们正在生成报告,他们可以继续使用该应用程序。

同时,有一个独立于网站的后台进程(但如果您愿意,仍然可以在 PHP 中)监视该表以获取排队的报告并处理它们。(例如,它可能会定期轮询表。)作为一个单独的非 Web 应用程序,此过程不受 Web 服务器规则的约束。它可以运行很长时间,它可以在多个线程/内核/等上运行多个并行实例,它可以与 Web 界面分开扩展,等等。

此后台进程将看到新记录并生成报告。它应该立即更新记录以表明它正在运行该报告,因此该流程的另一个实例不会重复该工作。完成后,使用详细信息(例如生成的报告的路径)更新记录。

该网站可以简单地具有某种通知系统,让用户知道报告已准备好。例如,也许每个页面都会针对报告表运行一个快速查询,以查看用户是否有已完成/未读的报告。当有时,某种通知会告诉用户这一点,用户可以下载新报告。


长话短说...不要在 Web 应用程序中生成报告。Web 应用程序只是排队/进行中/已完成报告列表的接口。Web 应用程序之外的另一个进程应该处理长时间运行的任务。


推荐阅读