2015-06-14 11 views
0

我需要爲用戶提供導出一堆PDF(發票)的功能。
問題是,每次用戶打開PDF時都會生成PDF。
所以我沒有將它們存儲在文件系統中。從用戶導出一堆PDF的高效方法?

所以,我的問題是,什麼時候導出用戶的PDF的時候,他們想要什麼?

例如,用戶想要導出上一季度的100張發票。
然後,我需要調用一個生成PDF的腳本,並將它們放在一個.zip文件中。
但是,如果多個用戶同時請求重導出?

我正在考慮每隔10分鐘左右運行一次cronjob,但這並不能解決腳本可能的沉重問題。

我是否需要運行多個cronjobs,才能分別處理一部分導出?

或者我可以以某種方式創建一個真正高效的腳本,也許可以分幾批分開所有的PDF?

我正在使用wkhtmltopdf來生成PDF文件。
幸運的是,渲染PDF的速度非常快。
雖然它仍然取決於內容,當然。
平均而言,一個PDF大約需要3-5秒才能渲染。

任何幫助或指導方針將不勝感激!
感謝


後續問題:如果我每張發票保存到一個文件系統,只要它的創建或更新,我需要找到一個方法來做到這一點的背景下,以避免不必要的等待。
隊列將是我的救世主,對吧?

+0

我目前正在開發一個非常類似的設置。我對使用gearmand Job server非常滿意 - 這是一個非常好的(分佈式)作業隊列系統,可以在後臺執行繁重的處理。還要注意,對整個批處理使用一個單獨的Xvfb-Process而不是使用'xfvb-run'可能會嚴重加速這一代。 (需要0。09secs/Page,並且與CPU-Cores的數量完全一致) – tillz

回答

3

在將數據保存到數據庫中時生成發票並將數據庫條目存儲到文件系統URL。如果用戶請求某個時間段的發票包,請將已生成的PDF收集到一個zip文件中並提供一個下載鏈接。 要求在服務器上有足夠的文件存儲空間。

您可以將發票存儲限制爲一年。如果用戶請求較早的發票,他們必須生成otf。


後續答: 既然你在PHP的環境中,我建議實行某種invoiceChanged處理程序。如果您調用它(帶有參數invoiceNr),則不推薦使用的PDF文件將被刪除,並根據修改後的數據生成一個新文件。如果它使用相同的文件名,則甚至不必更新數據庫中的文件URL。

+0

問題是,當前的發票都不存儲。所以我仍然需要一個腳本來預先渲染和存儲所有的腳本? – jlmmns

+0

這將是一次性的任務,肯定需要一些時間,但聽起來不太複雜。一個簡單的腳本爲每個發票調用wkhtmltopdf庫;保存發票到文件系統和鏈接到數據庫將做。 –

+0

我仍然需要一個高效的腳本來做到這一點,因爲我們正在談論10k +發票,並且快速上漲。如果我有這樣的腳本,我可以在導出時使用該腳本進行即時生成。 – jlmmns