コード上は問題なさそうなのに実行しているとなぜか止まる、みたいなことが繰り返しあり、調査したときの話です。
環境はPHP5.6です。
「Fatal error: Allowed memory size of 134217728 bytes exhausted」が発生していた
結論として「Fatal error: Allowed memory size of 134217728 bytes exhausted」が発生していたことに気付いたため、PHPに設定しているメモリ不足でした。
これはphp.iniのmemory_limitを調整してやればよいだけなので、1024Mに設定したところ無事動作しました。
500エラーとして検知されなかった
わかってみれば単純な話なのですが何故気がつかなかったのかといいますと、ログに記録されていたHTTPステータスコードは200で、nginxのログにもphp-fpmのログにもFatal Errorが記録されていなかったところと、APIとして使っていたのでアプリ側でエラー画面を表示していなかった(エラーとは出していたが、PHPエラーのHTMLを全て出してはいなかった。ある意味当然)ところで気付くのが遅れた感じです。
APIを直接叩いてその結果を出力したところ、PHPのエラー画面になっていたので内容も知ることができました。
APIとして見たときには、突如死ぬようにしか見えていませんでした。
今回はDBクエリの結果取得で引っかかったので例として出しますが、同じようにメモリを食いそうなところで止まってしまう場合、PHPからの出力そのものを確認してみるとよいかもしれません。割とあります。
Fatal Errorをログに出力したい
じゃあこれを自前で拾ってログに出したい! って思うのが人情なのですが…set_error_handlerでは拾ってくれませんでした。PHP7でも拾ってくれない感じです。
register_shutdown_function を登録すると、Fatal Errroで落ちた後に処理が来るので、error_get_last でFatalエラーを取得することが出来ました。
…でもfuelPHPのほうでは設定したつもりでも上手くいかなかったので、フレームワークごとに何か別の条件でもあるかもしれません…