我正在使用cakephp和Mysql来开发一个商店系统,其中注册我销售的所有产品,系统工作正常,直到我开始进行一些测试,我已经介绍了超过30,000个产品的寄存器,并从那里开始,我无法搜索我的产品,因为我遇到了这个错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
从我的研究中发现,如果发现这与记忆有关,我可以增加记忆力,但我也意识到这些将是动量解决方案。 我已经看到控制器产品中调用的函数是这样的:
public function search() {
$this->Product->recursive = 0;
$this->set('products', $this->paginate());
$products = $this->Product->find('all');
$this->set(compact('products'));
}
从此我发现这可能是问题,因为它正在获取所有产品。
所以我需要的帮助是如何改进这一点,这将是最好的方法。在我的研究中,我期望获得的解决方案之一可能是获得此查询,但是时间上取得10,我不知道是否可能。
先谢谢。 PS
答案 0 :(得分:4)
删除最后两行。
您正在进行分页调用,这是您想要的,但随后将其丢弃并获取所有记录。当你有大量数据时,这是非常昂贵的。
public function search() {
$this->Product->recursive = 0;
$this->set('products', $this->paginate());
}
答案 1 :(得分:3)
如果您使用的是CakePHP版本2,这是使用paginator的正确方法,您还可以使用其他内容(如10,20,30等)限制每页数据,以便无法一次加载所有数据
public function search() {
$this->Paginator->settings = array(
'limit' => 10,
'recursive' => 0
);
$products = $this->Paginator->paginate('Product');
$this->set(compact('products'));
}