浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

LaravelでGateway Timeout…PHPが重いのかと思ったらクラスの参照ミスしてただけだった話

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側のタイムアウトが発生する場合は、処理やサーバー設定の見直しよりも前に、シンタックスエラーや参照エラーを起こしていないかチェックする必要がありそうです。

  • この記事いいね! (3)