Laravelで久々にあたらしいシステムを構築しているのですが、新しいページを作成した際、
Gateway Time-outエラーが発生。
このLaravelはphp-fpm上で動作していて、504エラーはphp-fpmと連携しているnginxが吐き出したもの。
つまるところphpの実行時間がタイムアウトしていた状況だったのですが、ログインチェック以外は処理をほぼ入れていない状態だったので、なぜタイムアウトが発生するのか謎の状態でした。
とりあえず、nginx側の設定ファイルに
fastcgi_read_timeout 1000
の設定値を入れて試したところ、一応タイムアウトエラーが解消され、かなり長い待ち時間の後に
Class 'App\Http\Controllers\Admin\Controller' not found
Controllerクラスが見つからない、とのエラーが表示されました。
実はこの該当するコントローラーは、ネームスペースの指定が
namespace App\Http\Controllers\Admin;
となっており、各ページのコントローラーでExtendsしているベースのコントローラークラス(app/Http/Controllers/Controller.php)を直に参照できない環境となっていました。
この場合、ベースのコントローラークラス(app/Http/Controllers/Controller.php)を参照させるために、クラスの宣言の前に
use App\Http\Controllers\Controller;
を指定する必要があるのですが、これが抜けていたために同ネームスペース内の存在しないControllerクラスを探してしまうことになり、エラーとなっていたようです。
上記のuse文を入れたうえで再度実行したところ、一瞬で結果が表示されたため、おそらくLaravel内で存在しないクラスが参照された場合に、クラスの探索を行う何らかの仕組みがあって、その探索に時間がかかってタイムアウトとなっていたのではないかと予想できます。
つまり、Laravelで記述ミスがあった際、場合によってはシンタックスエラーではなくPHPのタイムアウトエラーが出てきてしまう場合がある、ということになります。
もしLaravelを使用していてPHP側のタイムアウトが発生する場合は、処理やサーバー設定の見直しよりも前に、シンタックスエラーや参照エラーを起こしていないかチェックする必要がありそうです。