最近在工作上一直處理匯出報表這件事情,整體來說, Laravel-Excel 已經能符合大部分的需求,安裝與使用上,也不是很複雜 (難的是撈資料啊....)。
不過,有個很懊惱的問題是,如同這位先生問的一樣:
exporting large files in separate sheets
我的問題不完全跟他一樣,但重點很像。如果資料量太大,要用 excel 匯出,會非常吃 memory,(PHPExcel是在 memory 中處理所有資料),一等就是遙遙無期 ( 我改用 fputcsv 超級快... 但是在mac會有亂碼問題 ),可能檔案還沒下載下來,畫面就先掛掉了,除此之外,你還可能會經歷兩種 fatal error:
(1) PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 32 bytes)
(2) PHP Fatal error: Maximum execution time of 60 seconds exceeded
第一個是,memory 不夠了,怎麼辦?! 你願意拿 memory 來換 xls 檔嗎? 可以的話,就不用吝嗇付出更多的 memory,設定一下 memory_limit (example: ini_set('memory_limit', '1G')) 。
第二個,時間不夠用。你可以等嗎? 那你可以把 max_execution_time 調高 ( ini_set('max_execution_time', 600);)。
以上兩種調整,可以讓 xls 成功匯出,但可能一等就是十分鐘,經測試,絕對不是 Query 慢,再慢也不會是這樣,而是 PHP 會等資料都 ready 好之後,再放到 xls 檔,所以佔用記憶體,你必須等...。
還有一種方法,就是把這樣的任務放到 background 去跑,礙於時程壓力,經驗不夠,我沒有走這種方式,我也不曉得測出來的結果如何,簡直悲劇一場。
結論: 我不想讓客戶久等,我暫時用 fputcsv 來擋一下當時專案匯出報表的需求...。至於 xls 我目前只會用在小量資料匯出。
(PS: fputcsv 要處理 select query 回來的 2 維陣列,又有一點麻煩之處,有空再紀錄 xdd)
不過,有個很懊惱的問題是,如同這位先生問的一樣:
exporting large files in separate sheets
我的問題不完全跟他一樣,但重點很像。如果資料量太大,要用 excel 匯出,會非常吃 memory,(PHPExcel是在 memory 中處理所有資料),一等就是遙遙無期 ( 我改用 fputcsv 超級快... 但是在mac會有亂碼問題 ),可能檔案還沒下載下來,畫面就先掛掉了,除此之外,你還可能會經歷兩種 fatal error:
(1) PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 32 bytes)
(2) PHP Fatal error: Maximum execution time of 60 seconds exceeded
第一個是,memory 不夠了,怎麼辦?! 你願意拿 memory 來換 xls 檔嗎? 可以的話,就不用吝嗇付出更多的 memory,設定一下 memory_limit (example: ini_set('memory_limit', '1G')) 。
第二個,時間不夠用。你可以等嗎? 那你可以把 max_execution_time 調高 ( ini_set('max_execution_time', 600);)。
以上兩種調整,可以讓 xls 成功匯出,但可能一等就是十分鐘,經測試,絕對不是 Query 慢,再慢也不會是這樣,而是 PHP 會等資料都 ready 好之後,再放到 xls 檔,所以佔用記憶體,你必須等...。
還有一種方法,就是把這樣的任務放到 background 去跑,礙於時程壓力,經驗不夠,我沒有走這種方式,我也不曉得測出來的結果如何,簡直悲劇一場。
結論: 我不想讓客戶久等,我暫時用 fputcsv 來擋一下當時專案匯出報表的需求...。至於 xls 我目前只會用在小量資料匯出。
(PS: fputcsv 要處理 select query 回來的 2 維陣列,又有一點麻煩之處,有空再紀錄 xdd)
沒有留言:
張貼留言
若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD