2017-03-04 96 views
0

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

作为对此问题的修复,我在发票生成更新此列时向表“payments_by_due_date”添加了一个新列。 更改并更新所有记录后,我尝试使用~1000个发票,并花费3〜4秒钟获取所有记录,为所有发票制作PDF并将它们全部打包到一个zip文件中,并将该zip文件移交给用户下载。

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

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

+1

也许我错过了,但问题在哪里? – Jhecht

+0

@Jhecht每张发票都是指引发递归的“以前的发票”,有什么适当的方法来处理MySQL中的递归? –

+0

嗯,有趣的问题。老实说,从来没有这样的东西弹出。我的第一个倾向是创建一个名为'previous_balance'的列,我可能会在创建后附加到触发器。这将查找以前的账单 - 付款并将其插入行中。我只是不觉得在所有时间点上都需要将它们联系起来。他们要么偿还了以前的账单,要么他们没有。 – Jhecht

回答

1

对于您的问题没有明确的答案 - 它更多的是关于更多的方法,而且是非常适合特定于应用程序。

的几点:

关于内存 - 是的,这很可能会炸掉你的服务器,更大的数据集变得越糟糕它会得到 - 如果你谈论的是递归地处理大型数据集走。

在此情况下,如果可能,请使用laravel队列将繁重的数据处理加载到背景中。例如,在用户请求时触发事件,然后在用户的前端显示一条通知,告知用户“我们正在处理您的请求,我们会通过一次完成的链接向您发送电子邮件” - 有点像Google如何处理它们“外卖”(https://www.google.com/settings/takeout)的作品。

关于重新计算 - 几乎与第一点相同。如果将其推入后台进程,大数据处理将会减少伤害。

同样,这是非常特定的应用程序。如果可能的话,将问题分解成具有非常具体要求/结果的较小的可回答问题。