打破大规模的MySQL更新

时间:2012-09-13 22:42:18

标签: php mysql codeigniter bigdata

现在我在CodeIgniter模型中有这样的东西:

<?php 
$array = array(...over 29k IDs...);
$update = array();
foreach ($array as $line) {
   $update[] = array('id' => $line, 'spintax' => $this->SpinTax($string));
   ### $this->SpinTax parses the spintax from a string I have. It has to be generated for each row.
}
$this->db->update_batch('table', $update, 'id');
?>

前20k记录更新得很好,但在完成之前我得到504 Gateway Time-out

我已经尝试将nginx服务器超时增加到一些荒谬的东西(比如10分钟),但我仍然得到错误。

如何才能使超时。我已经阅读了许多答案和HOW-TO来分割更新,但我继续得到服务器超时。 PHP或CodeIgniter解决方案非常好,我需要将此代码部署到可能未使用nginx的多个服务器(Apache中的类似错误)。

提前致谢。

1 个答案:

答案 0 :(得分:3)

您可能需要通过命令行和set_time_limit(0)运行此操作。如果你在codeigniter中,请查看如何通过用户指南运行命令行。 http://codeigniter.com/user_guide/general/cli.html

现在,在你这样做之前,你提到你正在使用数组块。如果您从数据库中获取所有值,则无需使用array_chunk。例如,设置一个get变量。 / your / url?offset = 1000,当完成时,重定向到同一个东西,但是用2000等等直到它完成。

不是最好或最干净的,但可能会完成它。