如何在PHP中进行长时间的批处理?

时间:2009-05-10 09:07:37

标签: php batch-processing

当我需要从上传的CVS文件更新我的db表(大约100000-500000行)时,我有批处理过程。通常需要20-30分钟,有时甚至更长。

最好的方法是什么?对此有什么好的做法?任何建议将不胜感激

感谢。

5 个答案:

答案 0 :(得分:7)

从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预先转换它,或者将其加载到“staging”表中,让MySQL处理必要的转换 - 以哪个为准更快更方便。

作为一个额外选项,似乎有可能通过MySQL Native Driver for PHP (MYSQLND)异步运行MySQL查询。也许你也可以探索这个选项。它可以让你保持快速的UI性能。

答案 1 :(得分:1)

如果您正在进行大量插入,那么您是否正在进行批量插入?就像这样:

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

这将大大加快插入速度。

您可以做的另一件事是在进行更改时禁用索引,然后在完成后让它一次性重建索引。

关于你正在做什么的更多细节,你可能会得到更多的想法

答案 2 :(得分:1)

PEAR有一个名为Benchmark的软件包,它有一个Benchmark_Profiler类,可以帮助您找到代码中最慢的部分,以便进行优化。

答案 3 :(得分:1)

我们在一个大型应用程序中有这样的功能。我们遇到了将csv中的数百万行插入到包含9个索引的表中的问题。经过大量的重构后,我们发现插入数据的理想方法是使用mysql LOAD DATA INFILE命令将其加载到[临时]表中,在那里进行转换并将带有多个插入查询的结果复制到实际表中( INSERT INTO ... SELECT FROM)每次查询只处理50k行左右(表现优于发布单个插入但YMMV)。

答案 4 :(得分:0)

  

我不能用cron做,因为这是在用户控制下,用户点击进程按钮,稍后可以查看日志以查看进程状态

当用户按下所述按钮时,在数据库的表中设置一个标志。然后让你的cron作业检查这个标志。如果它在那里,开始处理,否则不。我适用,您可以使用相同的表格发布某种状态更新(例如,xx%已完成),因此用户可以获得有关进度的一些反馈。