php

PHPのエラーログってどこを見る?画面にエラーが出ないときの調べ方

PHPを書いて、サーバーにアップ。

ブラウザからアクセスしてみると――

500 Internal Server Error。

あるいは、

画面が真っ白。

前回は、PHPが表示してくれるエラー文から、

「何が起きた?」

「どのファイル?」

「何行目?」

を読み取る方法を紹介しました。

でも今回は困りました。

肝心のエラー文がありません。

これでは原因を調べられない……と思うかもしれません。

でも、まだ手がかりはあります。

こんなときに確認したいのが、

PHPのエラーログ

です。


事件発生:エラーなのに、何も教えてくれない

たとえば、PHPファイルを編集したあと、ページを開いたら500エラーになったとします。

500 Internal Server Error

これだけ。

PHPのコードを見ても、すぐには原因が分かりません。

AIに聞こうにも、

500エラーになりました。

だけでは、考えられる原因がたくさんあります。

PHPの書き間違いかもしれません。

.htaccessかもしれません。

サーバーの設定かもしれません。

そこで、

サーバー側に記録されている情報を確認してみます。


そもそも「ログ」って何?

ログ(log)は、簡単に言えば、

コンピューターが残している記録

です。

たとえばWebサーバーでは、

「このページにアクセスがあった」

「この処理でエラーが起きた」

といった情報が記録されることがあります。

その中でも今回見たいのが、

エラーに関する記録です。

イメージとしては、

PHPを実行
   ↓
何か問題が発生
   ↓
画面には詳しく表示しない
   ↓
でもログには記録する

という状態です。

画面に原因が書いていなくても、

裏側にはヒントが残っている可能性がある

わけです。


なぜ画面にエラーを出してくれないの?

ここで疑問が出てきます。

PHPが原因を知っているなら、

最初から画面に表示してくれればいいのでは?

実は、本番環境ではエラーを画面にそのまま表示しないことがあります。

理由のひとつが、外部に余計な情報を見せないためです。

PHPのエラーには、

/home/example/public_html/contact/send.php

のようなサーバー内部のパスや、

使っているファイル・処理についての情報が含まれることがあります。

サイトを訪れた一般ユーザーに、こうした開発用の情報を見せる必要はありません。

そのため、

利用者には詳しいエラーを見せない。
管理・調査する側はログを見る。

という運用があります。


「エラー表示」と「エラーログ」は別

ここは覚えておくと便利です。

PHPには、

画面にエラーを表示すること

と、

エラーをログへ記録すること

という別の考え方があります。

代表的なのが、

display_errors

と、

log_errors

です。

ざっくり言えば、

display_errors
↓
画面にエラーを表示する?

log_errors
↓
エラーをログに記録する?

という設定です。

そのため、

画面に何も表示されていない=PHPが何も記録していない

とは限りません。


エラーログはどこにある?

ここが一番知りたいところだと思います。

ただし、

「PHPのエラーログは必ずこのフォルダにあります」

とは言えません。

サーバーや設定によって保存場所が違うからです。

レンタルサーバーなら、管理画面に、

「エラーログ」

「アクセスログ」

「ログ」

などの項目が用意されている場合があります。

自分で管理しているサーバーなら、PHPやWebサーバーの設定を確認する必要があります。

つまり最初は、

利用しているサーバーでエラーログを確認する方法を調べる

のが正解です。

たとえば検索するなら、

利用しているサーバー名 PHP エラーログ

のように調べます。


error_logというファイルがある場合もある

環境によっては、

error_log

という名前のファイルにエラーが記録されていることがあります。

たとえば、

public_html/
├─ index.php
├─ contact/
│   ├─ form.php
│   └─ send.php
└─ error_log

のようなケースです。

ただし、

必ずerror_logというファイルが作られるわけではありません。

ここは重要です。

「error_logがない!」

となっても、

ログが存在しないとは限りません。

別の場所へ保存されていたり、サーバーの管理画面から確認する方式だったりします。


ログを見ると何が分かる?

たとえば500エラーになったページについて、ログにこんな記録があったとします。

PHP Parse error: syntax error, unexpected token "}" in /home/example/public_html/test.php on line 24

前回の記事を読んでいれば、少し読めます。

まず、

PHP Parse error

PHPの文法に関係するエラー。

そして、

test.php

問題が見つかったファイル。

さらに、

on line 24

24行目付近。

つまり、

「test.phpの24行目付近を確認しよう」

まで一気に絞り込めました。

500という数字しか分からなかったときより、かなり前進しています。


いきなり全部のログを読まなくていい

エラーログを初めて開くと、

大量の文字が並んでいる

ことがあります。

ここでも全部を理解する必要はありません。

まず確認したいのは、

エラーが起きた時刻

です。

たとえば、

「14時30分ごろにページを開いて500になった」

のであれば、その時刻付近のログを探します。

さらに、

問題が起きたPHPのファイル名

も探します。

send.phpで問題が起きたなら、

send.php

が含まれている記録を探す。

これだけでも、関係のないログをかなり除外できます。


「今のエラー」なのか確認しよう

ここは実務で意外と大切です。

ログには、

以前起きたエラーも残っています。

たとえばログを開いたら、

PHP Fatal error...

と書かれていた。

「これだ!」

と思って修正したけれど、直らない。

よく見ると、そのログは、

3日前のものだった。

ということもあります。

だから、

  1. 問題のページへアクセスする
  2. エラーを発生させる
  3. すぐログを見る
  4. 同じ時刻付近の記録を探す

という順番にすると、現在の問題を見つけやすくなります。


ファイル名も確認する

時刻だけでなく、ファイル名も重要です。

たとえばログに、

/home/example/public_html/contact/send.php

と書いてあれば、

contactフォルダのsend.php

で問題が起きていると分かります。

同じ名前のPHPファイルを複数置いている場合は特に、

どのsend.phpなのか?

まで確認しましょう。


ログが見つかったらAIにも渡せる

ここでAIがかなり役立ちます。

500エラーだけを伝えて、

原因は何ですか?

と聞くより、

PHPで500エラーになりました。
エラーログには次のように記録されています。

PHP Parse error: syntax error, unexpected token "}" in /home/example/public_html/test.php on line 24

どこを確認すればいいですか?

と聞いたほうが、圧倒的に原因を絞りやすくなります。

さらに、23~25行目付近のコードを一緒に渡せれば、もっと調査しやすくなります。

つまり人間が全部直せなくても、

AIに渡す「手がかり」を集めることはできる

わけです。


AIにPHPファイル全部を渡す前に

エラーが出ると、

「とりあえずプロジェクト全部AIに渡そう!」

となることがあります。

それで解決することもあります。

でも、その前に、

500エラー
↓
ログを見る
↓
test.php
↓
24行目付近

まで分かれば、調査範囲をかなり小さくできます。

これはAIを使う場合にも重要です。

必要な部分だけを見てもらったほうが、

何を調査しているのかが明確になる

からです。


開発中なら画面にエラーを出せばいい?

ここまで読むと、

開発中だけdisplay_errorsをONにすれば楽なのでは?

と思うかもしれません。

その考え方自体はあります。

開発環境では、エラーを画面に表示すると原因を調べやすくなります。

ただし、

公開中の本番サイトで、安易に詳細なエラー表示を有効にするのはおすすめできません。

サーバー内部の情報などを訪問者へ見せてしまう可能性があるからです。

初心者のうちは、

本番サイトで原因が分からないからといって、いきなり設定を変更するのではなく、まずログを確認する

くらいに覚えておきましょう。


画面・ステータスコード・ログがつながった

ここで、これまでの記事をつなげてみます。

PHPを実行した。

↓

画面にPHPエラーが表示された

なら、

エラー文を読む。

↓

404・403・500などが表示された

なら、

HTTPステータスコードから調査する方向を考える。

↓

500だけで詳しい原因が表示されない

なら、

エラーログを確認する。

つまり、

何が表示されている?
        ↓
エラー文はある?
        ↓
ステータスコードは?
        ↓
ログには何が残っている?

と、少しずつ手がかりを集めていけばいいわけです。

いきなりPHPコード全部を理解する必要はありません。


今日の合格ライン

今回覚えてほしいのは、3つです。

1. 画面にエラーが出なくても、ログに記録されている場合がある。

2. エラーログの場所はサーバーや設定によって違う。

3. ログを見たら「時刻・ファイル名・行番号・エラー内容」を確認する。

そして、

ログに出たエラー文をAIや検索へ渡す。

ここまでできれば十分です。


ワンポイント答え合わせ

PHPページを開いたら、

500 Internal Server Error

とだけ表示されました。

PHPの詳しいエラー文は画面にありません。

次にすることとして、どちらがよいでしょう?

A:原因が分からないのでPHPを最初から作り直す

B:利用しているサーバーのエラーログを確認する

答えは、

Bです。

ログに、

PHP Fatal error...
PHP Parse error...

などの情報が残っていれば、そこから調査を進められます。

エラーが見えないからといって、

手がかりがないとは限りません。

画面に出ていなければ、

裏側に残った記録を探す。

これができるようになると、PHPのトラブル調査はもう一段楽になります。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。