2016-03-22 12 views
1

何か非常に奇妙なことが昨日コーディング中に起こった。Codeigniterの突然のPHPメモリリーク

私は新しい機能をテストしていましたが、すべてうまくいきました。問題ありません。テストメソッドでオブジェクトの成功したビルドをチェックするたびに、スクリーン上にjsonオブジェクトとprint_rを構築していました。

私はコードベースに実装していましたが、やはりうまくいきました。その後、別のメソッドを変更し、その新しいメソッドで動作するようにコードを更新し、関連するスクリーンをテストし、すべて正常に動作しました。

突然ページがリロードされると(すべて正常に動作した後に)、PHPのメモリリークエラーが発生します。

致命的なエラー:1342177280バイトの許容メモリサイズが使い果たさDに(65488のバイトを割り当てることを試みた):\ public_htmlの\ジェネシス\システム\コア\ common.phpのライン上の901

これは関係なく、私が単離何起こりません。

私もにインデックス・ページに変換しました:

public function index() { 
     echo 'Hello World'; 
    //$this->buildPage("login");  
} 

、それはまだエラーがスローされます。

私は現在、私のメモリ制限のためにこれを持っている:

memory_limit=2480M 

それは1280年で、その後、私は別の1200年とまだ差が追加されました。

私の他のサイトはうまく読み込んでいますが、これだけです。しかし、私はすべての方法をロードすることができないので、それをトラブルシューティングすることはできません。

他に誰かがこの問題を抱えていますか?

どのようにそれを把握するためのアイデアですか?

+0

一般的に、このタイプは、スクリプトのメモリ使用量が多すぎる場合に発生します。これは、制御が尽きるループがあり、ループの各パスでオブジェクトを作成したり、配列に追加したりしている場合、PHPでよく起こります。 **無限ループをチェックする**。 これが問題でない場合は、終了したオブジェクトを破棄してPHPを助けよう。たとえばnullに設定する。 $ OldVar = null;。 – Linus

+0

古いオブジェクトを破棄しますか?このようなもの? function($ oldObj){ $ newObj = new stdClass(); $ newObj-> val1 = $ oldObj-valX; $ oldObj = null; return $ newObj; } – Solvision

+0

http://stackoverflow.com/questions/8798443/best-way-to-destroy-php-objectのようなもの – Linus

答えて

2

これでわかりましたが、ここで私がやったことと何が起こったのですか?

1)まずxDebugをインストールする必要がありました。 (https://xdebug.org/wizard.php

2)ページを読み込もうとするとエラーが発生することがありました。

私はCodeigniterで最大許容ネスト制限に達しました。これは、モデル内でモデルを読み込んで、再びモデルに戻ったためです。クロスモデルの使用が許可されていないことは分かりませんでした。

私はクラスベースの構造をプライマリモデルの読み込みをautoload.phpファイルに移しました。

これで物が再び読み込まれました。

+1

ええ、あなたはやった! '忘れないでください。php.iniファイルのmemory_limit変数をアップグレードしないでください。あるいは、ini_set( 'memory_limit'、 'XXXM')を設定してください。あなたが実行しているあなたのPHPファイルでは、XXXで定義したいMbメモリの量です。彼が望むメモリを食べるためにアプリケーションをレッスンしてください。 – Linus