0

我以前没有提供有关问题的良好信息。我的问题是,在 cake php .Cake php 中创建下拉树时会抛出此错误。

Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 429982192 bytes) in /home/isteam/public_html/upms/app/controllers/tests_controller.php on line 85

我试图通过 php inin 函数增加运行时间的限制,但没有成功。

ini_set('memory_limit','2000M');

我的代码表结构是这样的

|id|parent_id|cat_name|

我的代码如下

    function admin_takecat(){
$this->layout=false;
$this->render(false);
Configure::write('debug',2);
 App::import('Model','Category');
$this->cats=new Category();
$firstlevel=$this->cats->find('list',array('fields'=>array('Category.id','Category.cat_name'),'conditions'=>array('Category.parent_id'=>0,'department_id'=>9)));

$dropbox='<select>';
foreach($firstlevel as $id=>$val){
    $dropbox.='<option value='.$id.'>'.$val.'</option>';
    $count=$this->cats->find('count',array('conditions'=>array('Category.parent_id'=>0,'Category.department_id'=>9,'Category.parent_id'=>$id)));
    if($count>0){
    $dropbox=$this->_recursive($id,$dropbox,1);

    }

}
$dropbox.='</select>';
echo $dropbox;



}
    function _recursive($catid,$dropbox,$level){



  App::import('Model','Category');
$this->cats=new Category();
$listcats=$this->cats->find('list',array('fields'=>array('Category.id','Category.cat_name'),'conditions'=>array('Category.parent_id'=>0,'Category.department_id'=>9,'Category.parent_id'=>$catid)));
$mark='';
for($i=1;$i<=1;$i++){
    $mark.='-';

}

foreach($listcats as $id=>$val){
   $dropbox.='<option value='.$id.'>'.$mark.$val.'</option>';
    $count=$this->cats->find('count',array('conditions'=>array('Category.parent_id'=>0,'Category.department_id'=>9,'Category.parent_id'=>$id)));
    if($count>0){
    $dropbox.=$this->_recursive($id,$dropbox,$level+1);

    }


}


return $dropbox;


}

请建议我该怎么做..或任何其他方式来做到这一点..

4

1 回答 1

0

错误消息非常清楚:您正在获取大量数据,因此应用程序内存不足。并且简单地增加可用内存量并不是一个解决办法,它是一个非常草率的解决方法,它会破坏下一个服务器上的应用程序,并且配置更严格的内存设置。

正如罗斯已经建议检查TreeBehavior或通过限制查找中关联模型记录和字段的递归级别来修复您的代码以返回不多的数据。

此外,您应该真正遵循CakePHP 编码标准,因为您的代码非常糟糕且难以阅读。我不会接受此代码,不是作为开发人员,也不是作为客户。

您应该通过模型关联访问数据,而不是使用 loadModel() 将每个模型加载到控制器中。

对于 dropbox,有 HtmlHelper,具体来说是 HtmlHelper::input() 和 HtmlHelper::select()。

于 2012-07-02T08:09:12.820 回答