2017-03-04 95 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)的作品。

關於重新計算 - 幾乎與第一點相同。如果將其推入後臺進程,大數據處理將會減少傷害。

同樣,這是非常特定的應用程序。如果可能的話,將問題分解成具有非常具體要求/結果的較小的可回答問題。