我想循环更新我的数据库。数据是来自我加载的xml文件的价格和股票信息。大约有8千件我想更新。它需要相当长的时间,大约在项目3000的服务器响应与错误500.CakePHP:循环中的数据库更新 - 服务器响应错误500
我想知道如果没有更好的,更Cake'ish的方式来做到这一点。
我想循环更新我的数据库。数据是来自我加载的xml文件的价格和股票信息。大约有8千件我想更新。它需要相当长的时间,大约在项目3000的服务器响应与错误500.CakePHP:循环中的数据库更新 - 服务器响应错误500
我想知道如果没有更好的,更Cake'ish的方式来做到这一点。
对于这样的任务,应使用shell或某种事件调度系统。然后读取您想要一次更换的数据块。你这样做只会导致填充内存并出错。
如果你想在正确的CakePHP中做一些事情,停止编写臃肿的控制器和更重要的:停止使用query()。我建议你先学习和理解MVC和一些软件设计原则。
也停止使用可怕的变量名称,如“artPriceArr3”或“艺术”。这是一件艺术品吗?一篇文章?一个艺术家?阅读:Clean Code
这里是我的控制器代码 - 更清洁:
$this->Stock->query('TRUNCATE stocks;');
$itemsFromXml = $this->XmlPricelist->getXml();
$fields = array('id','amount','price');
$values = array();
foreach($itemsFromXml as $key=>$item){
$values[] = array($item['id'],$item['stock'],$item['price']);
}
$this->multiSave($this->Stock,$values,$fields);
您也可以使用'DboSource :: insertMulti()'插入一堆排在一个事务中,而不是单独运行查询每个插入。有关示例实现,请参见['CakeTestFixture :: insert()'] [http://api20.cakephp.org/view_source/cake-test-fixture#line-201]。 – jeremyharris 2012-04-23 14:31:05
@burzum感谢您的回复。你是对的。查询不应该在控制器中。整体是拼凑而成的,应该重写。 – user1350963 2012-04-23 20:47:59
@ user1350963请参阅'Model :: updateAll()'(http://api20.cakephp.org/class/model#method-ModelupdateAll)。 – jeremyharris 2012-04-23 20:51:44