0

私は以前、質問に関する良い情報を提供していませんでした.私の質問は、ケーキ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

エラー メッセージは非常に明確です。大量のデータを取得しています。そのため、アプリのメモリが不足しています。また、使用可能なメモリの量を増やすだけでは解決できません。これは非常にずさんな回避策であり、より厳密に構成されたメモリ設定を使用して次のサーバーでアプリを破壊します。

Ross が既に提案したように、TreeBehaviorをチェックするか、検索で関連するモデル レコードとフィールドの再帰レベルを制限することで、それほど多くのデータを返さないようにコードを修正します。

さらに、 CakePHP のコーディング標準に従うべきです。なぜなら、あなたのコードは恐ろしく、読みにくいからです。私は、開発者としてもクライアントとしても、このコードを受け入れません。

モデルの関連付けを通じてデータにアクセスし、loadModel() を使用してすべてのモデルをコントローラーにロードしないでください。

ドロップボックスには HtmlHelper があり、具体的には HtmlHelper::input() と HtmlHelper::select() です。

于 2012-07-02T08:09:12.820 に答える