PHPでスクリプトが無言で死ぬ

状況

CakePHPのプロジェクト。
自分で作った機能ではないが、数年前に作ってほったらかしだったCI環境のアップデートの必要があり、他に手が空いてる人がいないとのことで私が担当していた。テストを実行すると、スクリプトのプロセスがエラーログも何も出さずに突然終了してしまう事象が発生した。

原因

PHPエクステンションにインストール漏れがあった。エクステンションでインストールされる関数を利用している箇所でエラー制御演算子(@)が使われていたため、プロセスが落ちた時にログが出なかった。
テストケースをコメントアウトしながら実行して落ちるテストケースを絞り込み、実行されているメソッドのコードリーディングで発見した。

エラー制御演算子のドキュメントには以下の記述がある。

警告現在、エラー制御演算子プレフィックス”@”は、スクリプトの実行を 終了するような致命的なエラーの出力さえ抑圧します。このため、ある関数の エラー出力を抑制するために “@” を使用した場合、その関数が 利用できなかったり、ミスタイプがあった場合でも、原因を示すことなく その場所でスクリプトは終了してしまいます。

エラー制御演算子を外してテストを実行すると以下のようなエラーが出た。

Fatal error: Call to undefined function exif_imagetype() 

ログを見た瞬間に原因が分かる。エラー制御演算子が使われていたために3秒で原因が分かるエラーの特定に3日かかってしまった。まじ💩

メモ

PHPのプロセスが無言で死ぬ時はまず最初にエラー制御演算子を疑う。