处理MySQL / PHP中的递归

时间:2017-03-04 08:57:01

标签: php mysql laravel recursion

我开发了一个使用Laravel5 / MySQL构建的基于订阅的应用程序。我正在处理从mysql中获取发票。在每张发票上我们都要显示几列,即“上一次余额”,“付款”,“本月费用”,“到期日应付款”,“到期日后付款”。 现在,“上一次余额”是“从到期日支付”,从上一张发票开始计算为“以前余额” - “付款”+“本月费用”。 所以这里开始递归并将继续,直到获取数据库中的所有记录。这也适用于单张发票。但是当我尝试获取多个(100~200)服务器时会耗尽内存。有一张约13k的发票表。

作为此问题的解决方案,我在发票生成更新此列时向表“paid_by_due_date”添加了一个新列。 在更改和更新所有记录之后,我尝试了大约1000张发票,花了3~4秒来获取所有记录,为所有发票制作PDF并将它们全部打包成zip文件并将该zip文件移交给用户下载。

但是这种方法存在很大问题,如果将来任何发票都要求更正,那么在该特定发票之后生成的所有发票都需要手动更新。

所以,如果你们中的任何一个人能帮助我解决这个问题,我会很感激。

1 个答案:

答案 0 :(得分:1)

对于您的问题没有明确的答案 - 它更多地是关于方法而不是其他任何方法,并且非常应用程序具体。

几点:

关于内存 - 是的,这很可能会炸毁你的服务器,你的数据集越大,它就越糟糕 - 如果你在谈论递归遍历大数据集。

在此基础上,如果可能,使用laravel队列将大量数据处理卸载到后台。例如,在用户请求时触发事件,然后在前端向用户显示通知,说明我们当前正在处理您的请求,我们将在完成后通过电子邮件向您发送链接" - 有点像谷歌如何做他们的"外卖" (https://www.google.com/settings/takeout)有效。

关于重新计算 - 与第一点几乎相同。如果将其推入后台进程,大数据处理将受到的影响更小。

同样,它非常适合应用。如果可能的话,将问题分解为具有非常具体要求/结果的较小的问题。