長年動いていた PHP のシステムが急に不具合を起こした。こうした相談を受けることがあります。

古い PHP システムのバグ調査でやっかいなのは、エラーが表示されない設定になっていることが多い点です。「何も出ていないが動かない」という状態から始まることがほとんどです。この記事では、現場で実際に使っている調査の入口をまとめます。

まず確認する:エラーログの設定

php.ini の設定を確認する

PHP がエラーをどう扱うかは php.ini という設定ファイルで決まります。古いシステムでは、エラーを画面に表示しない設定(display_errors = Off)になっていることがほとんどです。

確認すべき主な設定項目:

設定項目調査時の推奨値内容
display_errorsOnエラーを画面に表示する
error_reportingE_ALLすべてのエラーを対象にする
log_errorsOnエラーをファイルに記録する
error_logファイルパスログの保存先

本番環境で display_errors = On にすると、エラーが一般ユーザーに見えてしまいます。調査のためにエラーを確認する場合は、ログファイルに記録する方法(log_errors = On)を使うか、本番と同じ構成の確認環境を別途用意するのが安全です。

エラーログファイルの場所を探す

error_log に指定されたファイルを確認します。設定が分からない場合は、/var/log/apache2//var/log/httpd//var/log/php/ といった一般的な場所も確認してみてください。

エラーログが出ていない場合

ソースコード内の @ を疑う

PHP には @ を関数の前に付けることでエラーを抑制する書き方があります。

$result = @mysql_query($sql);  // エラーが出ても無視される

古いシステムではこの書き方が多用されていることがあります。@ があるとエラーログにも記録されないため、問題箇所を特定できません。

該当箇所の @ を取り除いて再実行すると、隠れていたエラーが表示されます。

よく遭遇するパターン

文字コードの問題

古い PHP システムで最も多いのが文字コード絡みの不具合です。システム内で EUC-JP や Shift_JIS が混在していたり、データベースとアプリケーションの文字コードが合っていなかったりします。

echo mb_internal_encoding();  // 現在の内部文字コードを確認する

タイムゾーンの問題

サーバーの設定変更や移行後に、日付がずれるトラブルが起きることがあります。

echo date_default_timezone_get();  // 現在のタイムゾーンを確認する

php.inidate.timezone が未設定の場合、PHP のバージョンによって動作が変わります。

旧式の mysql_* 関数が使えなくなった

mysql_connect()mysql_query() といった関数は PHP 7.0 で削除されました。サーバーの PHP バージョンを上げたタイミングで突然動かなくなるケースの代表例です。

echo phpversion();  // 現在の PHP バージョンを確認する

mysql_* 関数を使っている場合は、mysqli_* または PDO への書き換えが必要です。

おわりに

「何も出ていないが動かない」状態でも、エラーログを有効にして出力を確認できる状態にすることで、原因を特定できる可能性が大きく上がります。

調査の結果、修正範囲が広い、またはPHPのバージョンアップが必要だと分かった場合は、PHPフレームワークのバージョンアップ戦略も参考になります。

不具合の原因調査から修正、継続保守まで必要な場合は、レガシーシステム保守または障害調査・原因分析からご相談ください。古いシステムを保守できる状態へ戻す考え方については、レガシーシステム再生とは?でまとめています。

関連記事

仕様書がない古いシステムを保守するには?最初に行うべき現行調査

smiyabe

宮部 敏史

20歳からプロとして現場に立ち続けるシステムエンジニア。Webシステム開発・サーバ運用を中心に、現場目線での技術発信を行っています。ヘヴィメタル系ボーカリスト・ベーシストでもあり、現在は「ななこぴ⚡️」で活動中。料理と食べることも好きです。

← ブログ一覧へ戻る

システムの「困った」、まずはお聞かせください

原因不明の障害、誰も触れない古いシステム、属人化した運用。状況の整理からお手伝いします。お見積り・ご相談は無料です。

お問い合わせ