今、仕事で Laravel(PHP のフレームワークです)使っています。まだロクに理解していないのに、すでにコード書いてるってところがなかなか怖ろしいのですが、先日「あれっ!?」と思ったことがあったので、ここにメモを残しておきます。
投稿されたデータを登録するために Eloquent の create メソッドを使ったコードを追加したら、エラーが出ました。追加したコードはこんな感じ(企業秘密を漏洩するわけにはいかないので、実際のコードとは違います)。
$zzz =App\Zzz::create(['name' => 'Zero', 'type' => 'sleep', 'point' => 0]);
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 254435456 bytes)
「利用可能なメモリを使いきった」というもので、対処法をネットで調べてみると、「そおいう時は php.ini の設定変えて、最大利用メモリを増やせ」というのばかり出てきます。でもねぇ・・・、わたしがコード追加する前の状態ではメモリには十分余裕があるみたいだし、追加したコードもメソッド1個使ってレコード1行追加するだけでデータ量もほんのちょっと。こんなんでいきなりメモリ不足になるなんておかしいなあと思い、よくよくエラーメッセージ見たら、いきなり 250MB もメモリ確保しようとしている! 最大利用メモリの約半分! そんなわけねぇだろ!
半日かけて調査。ようやく判明した原因は意外なところにありました。メソッド create を使うときはそのモデルに fillable か guarded の設定が必要なんですが、このモデルの fillable はこんなんでした(設定したの、わたしじゃないよ)。
protected $fillable = ['name', 'point'];
属性が1個(この場合、type )、抜けてただけでした。わかってみれば「な〜んだ」ってなもんですが、エラーメッセージ、わかりにくいよ・・・。「利用可能なメモリを使いきった」っていうだけでモデルの設定に原因があると気がつく人なんて、そうそういるとは思えないんだけど。設定に抜けがあるだけで 250MB もメモリ確保しようとするフレームワークも謎ですが。・・・、解決したんだからいいか。