メニュー 蕭寥亭 検索

開店休業の記

技術系小ネタ

 今、仕事で 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 もメモリ確保しようとするフレームワークも謎ですが。・・・、解決したんだからいいか。