數據報表導出功能改進

1、           前言php

財務在每個月月底作財務數據統計時,須要統計每個月產品的出貨單及退貨單報表數據,故要求在每個月月底要彙總當月的報表數據,每一季度或者半年也要相應的統計報表數據,並能把數據導出到excl表格,因此數據報表導出功能則是必然的。財務提供的excel表格字段繁多,彙總下關聯到數據庫表達到7張以上,故在進行出貨單或者退貨單報表查詢之時,因爲涉及到多張表關聯,故每次查詢都須要耗費至關多的時間和空間。html

 

2、           實現前端

數據報表只須要按照起始時間和結束時間進行查詢和導出。以出貨單爲例,歷史數據累計至今的出貨單以上萬至幾十萬之多。早期的導出功能是實時查詢並導出,在選擇時間段進行數據導出之時,若是時間跨度太大,後臺執行過久的話會致使前端頁面顯示錯誤信息,或者等待時間過長讓財務人員誤覺得導出失敗,用戶體驗也不是很好。mysql

 

3、           優化sql

a)         從服務器架設上優化數據庫

考慮到咱們是採用LAMP的服務器架構,PHP是部署到Linux環境下,能夠嘗試利用Linux提供的工具配合PHP使用。緩存

用戶使用的場景主要是財務人員查詢的基本上都是歷史或者已成型的數據,故咱們能夠在服務器空閒期間使用PHP-CLI方式後臺執行生成數據並插入到新設計的數據表中,用戶在使用過程當中能夠選取緩存數據導出報表的方式來生成excel數據。藉助於Linux環境下Crontab工具能夠實現此情景。具體的Crontab命令參考以下:服務器

/usr/local/php-5.4.26/bin/php 架構

-f /data/www/wms/index.php cli/crontab_report/export_to_db框架

 

b)        分批執行

後臺執行Crontab命令之時,若是一次性把全部數據經過SQL檢索出來再進行插入的話,在中間若是出現異常退出之時,則會致使前期所作的工做付之流水。且PHP自己在執行期間是會耗費內存的,是有可能出現異常退出的狀況,故能夠採用相似分頁查詢的方式對數據進行分批處理並插入。目前採用的是每一批次採用300條出貨單檢索並插入。

                  

c)         PHP執行內存設置

PHP腳本執行期間,是有內存消耗的,正常狀況下在PHP執行完腳本以後會自動釋放相應內存,但若是當前執行的腳本將要花很長時間並佔用比較大的資源之時,則會致使PHP執行內存達到必定上限而致使異常退出。使用PHP提供的memory_get_usage()函數咱們能夠查看在後臺執行PHP腳本所耗費的內存。採用上述B分批執行方式,每一批次採用300條數據檢索並插入,計算出內存差可算出檢索出300條記錄須要耗費大體1.6M內存,插入操做消耗128K數據,查詢PHP配置參數memory_limit96M,實際可插入數據13000-15000左右數據以後則會異常退出,而且查不出錯誤信息。

咱們能夠經過增大memory_limit參數值來延長PHP執行時間,有三種方式能夠設置此參數,一種是修改php.ini中的memory_limit參數,此方式對整個php環境影響較大,也可使用ini_set()函數臨時設置爲指定的memory_limit大小,一樣的在相應網站有.htaccess文件的時候也能夠修改相似以下php_value memory_limit 16M。實際測試環境下,經過ini_set設置memory_limit256M之時,實際可插入的數據達到42077條。

 

d)        執行期間實時釋放相應內存

上述C方式是採用擴大memory_limit的值來延長PHP的執行時間,但仍不可避免有些歷史數據是沒法生成的,表現爲只能緩存以前4-5個月數據,固然此狀況也基本知足要求。上述提到在檢索300條記錄時須要耗費1.7M內存,這消耗的資源是挺大的,咱們能夠採用相似C語言的方式,在不須要的時候把它釋放掉,上述情景主要都是與數據庫相關,咱們只要保證在檢索到相應參數並確認此在後續無用之時把他釋放掉,相應PHP函數是mysql_free_resultCI框架已作了封裝,調用CIfree_result函數便可。一樣的相應的數據在使用完以後能夠經過unset函數來釋放相應的PHP內存。

        

4、           參考文檔

1 PHP修改memory_limit的三種辦法

http://blog.chinaunix.net/uid-17085332-id-2832158.html

2PHP查看內存使用狀況:

http://blog.csdn.net/duotuu/article/details/7554207

相關文章
相關標籤/搜索