【要約】PHP 8.3 の JIT に「string を渡したのに string 型じゃない」と怒られて全ページ 500 になった話 [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
Nextcloudの運用者が、アプリ導入直後に全ページでHTTP 500エラーが発生する問題に直面した。当初は導入したアプリのコード不備を疑ったが、実際には実行環境の不具合であった。
- ・エラー内容:
must be of type string, string givenという自己矛盾したメッセージ。 - ・発生の引き金: アプリ導入に伴うopcacheのリセットと、それに伴うJITの再コンパイル。
- ・真の原因: JITによる機械語への誤コンパイル(型情報の破損)。
// Approach
運用者は、エラーメッセージの矛盾に着目し、段階的な切り分け作業を行った。値の異常ではなく、実行環境の異常を疑うアプローチを採用した。
- ・ログ解析:
preg_matchの引数に関する矛盾したエラーメッセージを確認。 - ・値の検証: DBを確認し、変数の値自体は正常であることを特定。
- ・切り分け: 設定変更なしでPHP-FPMを再起動し、エラーが解消することを確認。
- ・結論: JITによる機械語の誤生成と断定。
// Result
運用者は、JITを無効化することでシステムの安定稼働を実現した。Webアプリの特性を考慮し、リスクを排除する判断を下した。
- ・対策:
opcache.jit=offを設定し、JITを無効化。 - ・効果: 500エラーの再発を防止。
- ・パフォーマンス: I/O待ちが支配的なNextcloudでは、JITオフによる速度低下は軽微。
Senior Engineer Insight
> Webアプリ運用において、JITは「諸刃の剣」である。計算集約的な処理には有効だが、今回のようにコンパイラのバグによる致命的なエラーを招くリスクがある。NextcloudのようなI/Oバウンドな環境では、JITによる恩恵よりも、安定性を優先してオフにすべきである。トラブルシューティングでは「値」ではなく「実行環境(キャッシュ)」を疑う視点が不可欠だ。