簡體   English   中英

如何在PHP中進行長時間的批處理?

[英]How to do long time batch processes in PHP?

當我需要從上載的CVS文件更新大約100000-500000行的數據庫表時,我具有批處理過程。 通常需要20到30分鍾,有時會更長。

最好的方法是什么? 有什么好的做法嗎? 任何建議將不勝感激

謝謝。

從CSV導入500.000行需要30分鍾?

您是否考慮過讓MySQL做艱苦的工作? LOAD DATA INFILE ,它支持處理CSV文件:

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\n';

如果文件的形狀不正確,無法直接導入目標表,則可以使用PHP預先對其進行轉換,也可以將其加載到“暫存”表中,然后讓MySQL處理必要的轉換-以更快和更快速的方式進行。更方便。

作為附加選項,似乎有可能通過用於PHPMySQL本機驅動程序(MYSQLND)異步運行MySQL查詢。 也許您也可以探索該選項。 這將使您能夠保留快速的UI性能。

如果您要進行大量插入,是否要進行批量插入? 即像這樣:

INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (....

這將大大加快插入速度。

您可以做的另一件事是在進行更改時禁用索引編制,然后在完成后立即一次性重建索引。

有關您正在做的事情的更多細節,您可能會得到更多的想法

PEAR有一個名為Benchmark的程序包,它具有Benchmark_Profiler類,可以幫助您找到代碼中最慢的部分,以便進行優化。

在大型應用程序中,我們具有類似的功能。 我們遇到了將csv中的數百萬行插入具有9個索引的表中的問題。 經過大量重構后,我們發現插入數據的理想方法是使用mysql LOAD DATA INFILE命令將其加載到[臨時]表中,在其中進行轉換,然后將具有多個插入查詢的結果復制到實際表中( INSERT INTO ... SELECT FROM )每個查詢僅處理50k行左右(比發出單個插入但YMMV要好)。

我無法使用cron做到這一點,因為這是在用戶控制之下的,用戶單擊進程按鈕,以后可以檢查日志以查看進程狀態

當用戶按下所述按鈕時,在數據庫的表中設置一個標志。 然后讓您的Cron作業檢查此標志。 如果存在,請開始處理,否則不進行。 如果適用,您可以使用同一張表發布某種狀態更新(例如xx%完成),以便用戶對進度有一些反饋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM