長年動いていた PHP のシステムが急に不具合を起こした。こうした相談を受けることがあります。
古い PHP システムのバグ調査でやっかいなのは、エラーが表示されない設定になっていることが多い点です。「何も出ていないが動かない」という状態から始まることがほとんどです。この記事では、現場で実際に使っている調査の入口をまとめます。
まず確認する:エラーログの設定
php.ini の設定を確認する
PHP がエラーをどう扱うかは php.ini という設定ファイルで決まります。古いシステムでは、エラーを画面に表示しない設定(display_errors = Off)になっていることがほとんどです。
確認すべき主な設定項目:
| 設定項目 | 調査時の推奨値 | 内容 |
|---|---|---|
display_errors | On | エラーを画面に表示する |
error_reporting | E_ALL | すべてのエラーを対象にする |
log_errors | On | エラーをファイルに記録する |
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.ini の date.timezone が未設定の場合、PHP のバージョンによって動作が変わります。
旧式の mysql_* 関数が使えなくなった
mysql_connect() や mysql_query() といった関数は PHP 7.0 で削除されました。サーバーの PHP バージョンを上げたタイミングで突然動かなくなるケースの代表例です。
echo phpversion(); // 現在の PHP バージョンを確認する
mysql_* 関数を使っている場合は、mysqli_* または PDO への書き換えが必要です。
おわりに
「何も出ていないが動かない」状態でも、エラーログを有効にして出力を確認できる状態にすることで、原因を特定できる可能性が大きく上がります。
調査の結果、修正範囲が広い、またはPHPのバージョンアップが必要だと分かった場合は、PHPフレームワークのバージョンアップ戦略も参考になります。
不具合の原因調査から修正、継続保守まで必要な場合は、レガシーシステム保守または障害調査・原因分析からご相談ください。古いシステムを保守できる状態へ戻す考え方については、レガシーシステム再生とは?でまとめています。
関連記事