2011-06-26 37 views
0

私のPHPアプリケーションの1つで、許容メモリサイズが使い果たされました。CakePHPエラー許容メモリサイズが使い果たされました

私はそのエラーを得るために間違っていましたか?

インデックス(リスト)ページのデータベーステーブルからレコードを選択するために、「find」のようなもっと一般的ではないcakephpメソッドを使用するページに表示されます。

どうすれば修正できますか?問題は、商用サーバーでメモリサイズを設定できないことです。

ありがとうございます!

+2

さらに、メモリの割り当てに失敗した行があることに気付くと、その場所のコードを調べて何が起きているのかを確認することをお勧めします。 –

答えて

2

お使いのモデルの「封じ込める」動作を調べてください。これは中核的な振る舞いであり、あなたが見つけたものに追加する必要があるように聞こえ、取り戻すデータの量を制限します。また、検索結果をカスタムクエリに置き換えて検索し、返されるデータの量をさらに制限します。

0

多分xdebugのようなツールを使ってメモリ使用量を調べることができます。次に、その部分を試して最適化する必要があります(そしてその部分のみ=>早すぎる最適化なし)。

0

あなた.htaccessファイルに次のようなものを使用することができます。これは、あなたのPHP INIファイルをいじることなく、あなたのセットアップメモリ​​の制限を助けるべきである

php_value memory_limit 16M 

。 :))
これは一般的に、あなたの.htaccessファイルの最初の行であることを確認してください。..

禁欲が示唆したように
+0

tnxですが、私はこのようなソリューションをスキップしたいと思います。私はホスティングプロバイダによって定義されたメモリの限界に直面することができます。 – user198003

+1

CakePHPには多くの.htaccessファイルがありますが、この答えは不十分です。 –

1

、あなたの.htaccessファイルにあなたのメモリ制限を増やすことができますが、実際に試してみて、なぜ正確にそれを把握する必要がありますほとんどの中小規模のアプリやデータベースではデフォルトのメモリの制限でも十分であるため、メモリの容量を増やすほど、ホストプランを早期にアップグレードする必要があります。

Alfredが示唆しているように、メモリ検査ツールを使用することも可能ですが、アプリが合理的に基本的であり、失敗した動作が複雑でない場合は、コード内で告知記号を手動で探すことができます。まず、findのどこかに再帰的に2を設定しますか?その場合は、一時的に-1に変更してください。そうでない場合は、findの前に$this->Model->recursive = -1;を追加して、それが設定されていることを確認してください。

もちろん、あなたがこれを行うとクエリが失敗するかもしれませんが、少なくともあなたはすべてのメモリを食べていたことを知っています。 Cake automagicの代わりに、より効率的なカスタムクエリを見ることができます。特に、多レベルモデルの関連付けに基づく複雑なクエリには、膨大なオーバーヘッドがあります。

1

このエラーの原因となるその他の問題があります。

例えば、無意識に実装したような無限ループです。

は、私はすべてのJSON-コールのためのAjaxのビューをレンダリングするために、アプリケーションに望んでいた、と私は、Appコントローラにこれで終わった:

function beforeRender() { 

    parent::beforeRender(); 

    if ($this->params['ext'] == 'json') { 

     $this->render('Elements/json'); 

    } 

} 

beforeRender-方法に戻って繰り返して行くように見えます。

これは、同じ問題を抱えている人に役立つかもしれません。

関連する問題