9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FuelPHPでのメモリリーク?について

Posted at

環境
FuelPHP 1.7.2

発端
taskで数万件のレコードを操作する処理をしていたら、メモリ不足エラーが出てしまったので原因を調査。

再現
下記のソースで確認、再現。

for($i=0; $i<1000; $i++) {
    echo memory_get_usage(true), " usage.\n";
    $row = Model::find($i);
    unset($row);
}
for($i=0; $i<1000; $i++) {
    echo memory_get_usage(true), " usage.\n";
    $row = new Model();
    $row->save();
    unset($row);
}

また、下記のものではメモリ消費量の増加はみられなかった

for($i=0; $i<1000; $i++) {
    echo memory_get_usage(true), " usage.\n";
    $row = Model::find('first');
    unset($row);
}
for($i=0; $i<1000; $i++) {
    echo memory_get_usage(true), " usage.\n";
    $row = Model::find('first');
    $row->set('aaa', $i);
    $row->save();
    unset($row);
}

結論
どうやらORMでレコードを取得・追加する際に、プライマリキーを使ってスタティック変数に保存してしまうみたい。
Model.phpstatic::$_cached_objectsを参照。__construct(),create(),find()などで使われている)
そんでもっていくら格納され続けても開放されないため、そこにどんどんデータが溜まっていってメモリ不足、という流れになっている。

確かに何度もDBに問い合わせが飛ぶのを防ぐという意味ではスタティック変数とかに格納しておくのはいいんだけれど、これはこれで困ってしまう気もするなぁ。
格納する処理自体はConfigでもOFFにできない様子なので、Modelクラス自体をオーバーライドして適度なところでクリアかけるとかするしかないかも。

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?