【cakePHP】繰り返しrequestActionを呼び出すのをApp::usesにしたらメモリ使用量が抑えられた

cakePHPのシェルコマンドモードから繰り返しrequestActionを呼び出すコードを実行すると、2000回くらい繰り返したところでメモリオーバーで停止していたのを解決しました。

PHPバージョンが5.2なもので、バージョンアップすればガーベッジコレクションが効いてなんとかなるかも(PHP マニュアル >機能 >ガベージコレクション)、とも思ったのですが、お客様のサーバーだし、そもそもメモリーを使い続けるのがおかしいのでなんとかしてみます。

まず、メモリ使用量の計測

結果:

どんどんメモリ使ってますね。requestActionがかなりメモリを消費する関数だって事は分かっているので、ここをもう少し低レベルなものに置き換えます。単純にControllerクラスを呼び出すのがいいでしょうが、cakePHPにはApp::usesを使った便利な呼び出しがあります。

改善された!ちょっとづつ増えていますが、16Mくらいで安定して、増え続けるという事はありませんでした。

最初にApp::uses(“ItemsController”, “Controller”);で使用する事を宣言しておきます。App::importでもいいのですが、cakePHP2ではusesの方が使用する時だけ呼び出すのでいいっぽいです。

使用する時は$ItemsController = new ItemsController;で宣言して、いつも通り$ItemsController->action()でいいのですが、これだとbeforeFilterが実行されません。
$ItemsController->constructClasses();
$ItemsController->startupProcess();
をクラスの宣言直後に行う事で、初期化されるようになりました。

コントローラーの変数は直接操作できるので、$ItemsController->request->params[‘requested’] = 1のようにリクエスト変数をいじってrequest_actionと同じパラメータにすることもできます。