php - 从 MYSQL DB 生成 PDF 报告,循环遍历大量数据而不会超时 PHP
问题描述
我需要一些关于问题/实施的建议。所以我的平台有一个页面,用户可以在其中下载所有添加数据的 PDF 报告。数据下载到表格布局中并进行分页等,并且在每个页面的底部都有总计,前一页的总计和从图片中单独添加的数据中获取的总计。现在,当用户可能有 5000 多个条目时会出现问题,这将生成近 1000 页的 pdf 报告。对于每个新页面(计数器系统),然后发生多个查询以获取该特定页面的相关数据。如果用户确实有 5000 多条记录,那么服务器将在 45 秒后返回 NGINX 404 not found 错误。
所以我想知道我可以尝试什么来阻止这种情况发生,我尝试在所有查询周围添加 usleep() 以阻止它向数据库发送垃圾邮件,但这似乎不起作用。托管在 AWS 上
我知道关于位的信息不多,如果需要可以添加更多信息
谢谢
解决方案
如果请求需要很长时间才能响应(老实说,在网络术语中,任何超过几秒的时间都是“很长的时间”,任何可能超过 30 秒的时间都是永恒的),那么它不应该在原地完成这页纸。相反,将实际处理卸载到其他东西。
考虑一个用户“排队”要生成的报告的系统。这不仅仅是将记录写入数据库表。快速、简单地向用户提供反馈,告诉他们正在生成报告,他们可以继续使用该应用程序。
同时,有一个独立于网站的后台进程(但如果您愿意,仍然可以在 PHP 中)监视该表以获取排队的报告并处理它们。(例如,它可能会定期轮询表。)作为一个单独的非 Web 应用程序,此过程不受 Web 服务器规则的约束。它可以运行很长时间,它可以在多个线程/内核/等上运行多个并行实例,它可以与 Web 界面分开扩展,等等。
此后台进程将看到新记录并生成报告。它应该立即更新记录以表明它正在运行该报告,因此该流程的另一个实例不会重复该工作。完成后,使用详细信息(例如生成的报告的路径)更新记录。
该网站可以简单地具有某种通知系统,让用户知道报告已准备好。例如,也许每个页面都会针对报告表运行一个快速查询,以查看用户是否有已完成/未读的报告。当有时,某种通知会告诉用户这一点,用户可以下载新报告。
长话短说...不要在 Web 应用程序中生成报告。Web 应用程序只是排队/进行中/已完成报告列表的接口。Web 应用程序之外的另一个进程应该处理长时间运行的任务。
推荐阅读
- php - 在不超过时间限制的情况下保存许多csv的内容
- xml - XSLT 1.0 嵌套分组和循环
- dsl - DefaultTerminalConverters 的实现以实例化 Integer 而不是 Xtext 中的终端规则抛出 ClassCastException
- javascript - 对象中的数组在传递或 JSON.stringified 时为空
- android-studio - Android Emulator 反复丢弃 Charles Proxy
- javascript - 如何根据用户在提示中输入的数字减少 JavaScript 中的 for 循环?
- java - 如何以编程方式在异步任务中等待android(java)中的wifi连接(Acces Point)?
- python - 在 Python asyncio 中创建并发任务之间的依赖关系
- kubernetes - K8S 集群中 Libvirt 的 Prometheus Adapter 自定义指标
- javascript - 可以将整个 JSS (react-jss) 样式表导出为 CSS 字符串吗?