web-dev-qa-db-ja.com

PHPで便利なエラーメッセージを取得する方法

PHPでのプログラミングは非常にイライラするものです。かなり頻繁にスクリプトを実行して空白の画面に戻ります。エラーメッセージは表示されず、画面が空になるだけです。原因は、単純な構文エラー(角かっこが間違っている、セミコロンがない)、関数呼び出しが失敗した、またはその他の原因が考えられます。

何が悪かったのかを把握するのは非常に困難です。コードをコメントアウトしたり、いたるところに "echo"ステートメントを入力したりするなどして、問題を絞り込みます。しかし、もっと良い方法があるはずですよね。

それで、Javaのように有用なエラーメッセージを生成するためにPHPを取得する方法はありますか?誰でも良いPHPデバッグのヒント、ツール、テクニックを勧めますか?

530
Candidasa

構文エラーの場合は、php.iniでエラー表示を有効にする必要があります。 「顧客」にエラーメッセージが表示されたくないため、デフォルトではこれらはオフになっています。 PHPドキュメントの2つのディレクティブerror_reportingdisplay_errorsについては、このページをチェックしてくださいdisplay_errorsはおそらくあなたが変更したいものです。 php.iniを変更できない場合は、.htaccessファイルに次の行を追加することもできます。

php_flag  display_errors        on
php_value error_reporting       2039

すべてのエラーを取得するには、error_reportingのPHPのバージョンにE_ALLの値(Gumboで述べたとおり)を使用することを検討してください。 詳細情報

その他の3つの項目:(1)エラーログファイルはすべてのエラーが記録されているので確認できます(ログ記録が無効になっていない限り)。 (2)次の2行を追加すると、構文エラーではないエラーをデバッグするのに役立ちます。

error_reporting(-1);
ini_set('display_errors', 'On');

(3)もう1つの選択肢は、 PhpEd のように、入力時にエラーをチェックするエディタを使用することです。 PhpEdには、より詳細な情報を提供できるデバッガも付属しています。 (PhpEdデバッガはxdebugと非常によく似ており、エディタに直接統合されているので、1つのプログラムを使ってすべてのことを行えます。)

Cartmanの link もとても良いです: http://www.ibm.com/developerworks/library/os-debug/

471
Darryl Hein

以下はすべてのエラーを有効にします。

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

次のリンクも参照してください。

433
Eljakim

デバッグしたいファイルに次の行を含めることができます。

error_reporting(E_ALL);
ini_set('display_errors', '1');

これはphp.iniのデフォルト設定を上書きします。これはPHPにエラーをログに報告させるだけです。

54
Tomalak

PHPの設定

php.ini に2つのエントリがエラーの出力を指示します。

  1. display_errors
  2. error_reporting

productionでは、display_errorsは通常Offに設定されています(プロダクションサイトでのエラー表示は一般的に望ましくないので、これは良いことです)。

ただし、developmentでは、エラーが表示されるようにOnに設定する必要があります。 をチェックしてください。

error_reporting(PHP 5.3以降)は、デフォルトでE_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDに設定されています(つまり、特記事項、厳密な規格、および非推奨の注意事項を除くすべてのものが表示されます)。よくわからない場合は、allエラーを表示するためにE_ALLに設定してください。 をチェックしてください。

おっ、おっ!チェックなし! php.iniを変更することはできません。

残念です。通常、共有ホストはphp.iniファイルの変更を許可していないため、そのオプションは残念ながら利用できません。しかし、恐れないでください。他の選択肢もあります。

実行時設定

目的のスクリプトで、実行時にphp.iniエントリを変更できます。つまり、スクリプトが実行されたときに実行されます。甘い!

error_reporting(E_ALL);
ini_set("display_errors", "On");

この2行は、上記のようにphp.iniエントリを変更したのと同じ効果があります。驚くばかり!

私はまだ空白のページ/ 500エラーが出ます!

つまり、スクリプトは実行されていません。これは通常、構文エラーがあるときに起こります。

構文エラーがあると、スクリプトは実行時間に到達しません。 compile timeで失敗します。これはphp.iniの値を使用することを意味します。変更していない場合はエラーを表示できない可能性があります。

エラーログ

さらに、PHPはデフォルトでエラーを記録します。共有ホスティングでは、それは専用のフォルダまたは問題のあるスクリプトと同じフォルダにあります。

Php.iniにアクセスできる場合は、error_logエントリの下にあります。

50
Madara Uchiha

" xdebug "と呼ばれる本当に便利な拡張子があります。これはあなたのレポートをとても良くするでしょう。

29
gnarf

素早い、実地のトラブルシューティングのために、私は通常ここにここで提案します:

error_reporting(~0); ini_set('display_errors', 1);

トラブルシューティングの対象となっているスクリプトの冒頭に置かれます。これは完璧ではありません。完璧な変種はphp.iniでそれを有効にし、構文エラーと起動エラーを捕らえるためにPHPにエラーを記録することです。

ここに概説されている設定は、どのPHPバージョンに関係なく、すべてのエラー、通知、および警告を含みます。

考慮すべき次のこと:

  • Xdebug をインストールしてIDEでリモートデバッグを有効にします。

また見なさい:

24
hakre

あなたが超クールなら、あなたは試すかもしれません:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

これは、ローカルで実行しているときにのみエラーを表示します。また、test_server変数を他の場所で適切な場所に使用することもできます。

スクリプトが実行される前に発生したエラーは検出されませんが、私が行ったエラーの99%については、これは問題にはなりません。

16
Rich Bradshaw

ページ上部のパラメータを選択してください

error_reporting(E_ERROR | E_WARNING | E_PARSE);
15
Kld

これを持続させて快適にするために、php.iniファイルを編集することができます。通常は/etc/php.iniまたは/etc/php/php.iniに格納されていますが、ホスティングプロバイダの設定ガイドラインによっては、よりローカルなphp.iniによって上書きされる場合があります。一番上のLoaded Configuration Filephpinfo()ファイルをチェックして、どのファイルが最後にロードされるかを確認してください。

そのファイルでdisplay_errorsを検索してください。 3つのインスタンスのみがあり、そのうち2つはコメント化されています。

コメント解除された行を次のように変更します。

display_errors = stdout
15
Ram

Nette Tracy PHPのエラーと例外のより良い視覚化のために:

Nette Tracy screenshot

13
Ondřej Šotek
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

さらに、 xdebug を使ってより詳細な情報を得ることができます。

12
Yan.Zero
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
10
Abuzer Firdousi
error_reporting(E_ALL | E_STRICT);

そしてphp.iniの表示エラーをオンにする

9
Ólafur Waage

あなたは自分の エラーハンドラ をPHPに登録することができます。たとえば、すべてのエラーをファイルにダンプすると、このようなあいまいな場合に役立ちます。現在の error_reporting が何に設定されていても、あなたの関数が呼ばれることに注意してください。非常に基本的な例:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
8
soulmerge

これを試してみてください PHPエラー報告リファレンスツール 。これは非常に優れた視覚的な参照であり、複雑なエラー報告メカニズムを理解するのに役立ちました。

7
Rodney McIntosh

コードエディタとしてPHPStormを試してみるのもよいでしょう。エディタに入力しているときに、PHPやその他の構文エラーが多数見つかります。

6
user1681048

PHPから有用なエラーを取得するために必要な2つの主要行は、次のとおりです。

ini_set('display_errors',1);
 error_reporting(E_ALL);

他の貢献者が指摘したように、これらはセキュリティ上の理由からデフォルトではオフになっています。役に立つヒントとして - あなたがあなたのサイトをセットアップしているとき、これらのエラーがあなたのローカルおよび開発環境でデフォルトでONになるようにあなたの異なった環境のためにスイッチをすることは便利です。これは次のコードで実現することができます(理想的にはindex.phpかconfigファイルに入っているのでこれは最初から有効です):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
6
Code Synthesis

あなたがubuntuユーザーであるならば、あなたの端末に行き、このコマンドを実行してください

Sudo tail -50f /var/log/Apache2/error.log

最近の50件のエラーが表示されます。すべてのエラーを記録するApache2用のエラーファイルerror.logがあります。

5
Ashutosh Jha

FirePHP も便利です。

5
Rich Bradshaw

「エラー」は、開発者が自分の間違いを知り、それらを解決してシステムを完璧に動作させるための最も有用なものです。

PHPは、開発者に自分のコードがエラーを発生させる理由と場所を知るためのより優れた方法をいくつか提供します。

すべてのエラーメッセージを取得するために、スクリプトの先頭に次の2行を書くための最良の方法:

error_reporting(E_ALL);
ini_set("display_errors", 1);

IDEで xdebug などのデバッガツールを使用するもう1つの方法。

3
user3176739

完全なエラー報告を有効にするには、これをスクリプトに追加します。

error_reporting(E_ALL);

これにより、最小限の警告が表示されます。そして、念のために:

ini_set('display_errors', '1');

エラーの表示を強制します。実稼働サーバーではこれをオフにする必要がありますが、開発中の場合はそうしないでください。

3

Error_reportingおよびdisplay_errors ini設定以外に、WebサーバーのログファイルからSYNTAXエラーを受け取ることができます。私が開発しているときPHP私は自分の開発システムのWebサーバーのログを私のエディタにロードします。ページをテストして空白の画面が表示されるたびに、ログファイルが古くなり、編集者がそのページをリロードするかどうかを尋ねられます。実行すると、一番下にジャンプして構文エラーが発生します。例えば:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
3
jmucchiello

あなたは完全なエラー報告(通知や厳格なメッセージを含む)を有効にすることができます。冗長すぎると感じる人もいますが、試す価値があります。 php.iniでerror_reportingE_ALL | E_STRICTに設定します。

error_reporting = E_ALL | E_STRICT

E_STRICTは廃止予定の機能について通知し、特定のタスクを実行するための最良の方法についての推奨事項を提供します。

通知が不要で、他の種類のメッセージが役立つ場合は、通知を除外してみてください。

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Php.iniでdisplay_errorsが有効になっていることも確認してください。 PHPのバージョンが5.2.4より古い場合は、それをOnに設定します。

display_errors = "On"

バージョンが5.2.4以降の場合は、次のコマンドを使用してください。

display_errors = "stderr"
3
Ayman Hourieh

この答えは冗長部門の部門によってあなたにもたらされます。

  1. ini_set()php.ini/.htaccess/.user.ini

    設定display_errorsおよびerror_reportingは現在十分にカバーされています。しかし、どのオプションをいつ使用するかを要約すると、

    • _/ini_set() および error_reporting() はランタイムエラーにのみ適用されます。
    • php.ini は主に開発のために編集されるべきです。 (WebサーバーとCLIのバージョンは異なるphp.iniを持っていることが多いです)
    • .htaccess フラグは日付付きの設定でのみ機能します(新しいホストを探す!うまく管理されたサーバーはより安いです)。
    • .user.ini は最新の設定のための部分的なphp.iniです(FCGI/FPM)

    そしてランタイムエラーのための粗雑な代替手段としてあなたはしばしば使うことができます:

    set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
    
  2. error_get_last()

    Error_displayが無効になっている場合、最後のランタイム通知/警告/エラーを取得するために使用できます。

  3. $php_errormsg

    最後のPHP実行時メッセージも含まれているスーパーローカル変数です。

  4. isset()が始まった!

    私はこれが多くの人々を不快にさせることを知っていますが、 issetemptyではない 初心者には使われるべきです。あなたは通知抑制を追加することができます after あなたはあなたのコードが動いていることを確認しました。しかし、これまでにない。

    最近起きた「うまくいかない」質問の多くは、次のようなタイプミスの結果です。

    if(isset($_POST['sumbit']))
    #                  ↑↑
    

    あなたのコードがissetempty/array_keys_existsで散らばっているならば、あなたはどんな有用な通知も得ないでしょう。 @ を使用する方が賢明な場合があるので、少なくともログには注意と警告が表示されます。

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    assert()セクションに関する警告を受け取るため。 (非常に珍しいが、もっと熟練したコードにはいくつか含まれるかもしれません。)

    PHP 7ではphp.iniに zend.assertions=1 が必要です。

  6. declare(strict_types=1);

    厳密に型付けされた言語にPHPを曲げても、多くの論理エラーを修正することはできませんが、デバッグ目的のためのオプションです。

  7. PDO/MySQLi

    @Philは既に PDO/MySQLiエラー報告 オプションについて言及しています。他のデータベースAPIにも同様のオプションがあります。

  8. json_last_error() + json_last_error_msg

    JSON構文解析用です。

  9. preg_last_error()

    正規表現用です。

  10. CURLOPT_VERBOSE

    カール要求をデバッグするには、少なくともCURLOPT_VERBOSEが必要です。

  11. Shell/exec()

    同様に、シェルコマンドを実行してもエラーが発生することはありません。あなたはいつも2>&1が必要で、$ errnoを覗いてみてください。

1
mario

ここにあるすべての素晴らしい答えに加えて、MySQLiおよびPDOライブラリについて特別に言及したいと思います。

のために...

  1. データベース関連のエラーを常に確認する
  2. 何かがうまくいかなかったかどうか見るためにメソッドの戻り型をチェックすることを避け

最善の選択肢は、ライブラリを 例外をスローするように設定することです .

MySQLi

スクリプトの先頭近くにこれを追加してください

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

これはnew mysqli()またはmysqli_connect()を使う前に置くのが一番です。

PDO

接続インスタンスでPDO::ATTR_ERRMODE属性をPDO::ERRMODE_EXCEPTIONに設定します。コンストラクタでこれを行うことができます

$pdo = new PDO('driver:Host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

または作成後

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1
Phil

Kintを使用してください。それはステロイドのデバッグコマンドの組み合わせです。 https://kint-php.github.io/kint/ それはNette Tracyと非常によく似ています

0
siniradam

http://todell.com/debug も便利です。プロダクションモードでも、オブジェクトの値を確認したり、デバッグエラーを発生させたりすることができます。

0
PHPCoder

エラー報告を有効にすることは正しい解決策ですが、それを有効にしたプログラムでは効果がないようですが、その後に含まれるプログラムでのみ効果があります。

したがって、私はいつもここでポピュラーな解決策と本質的に同じコードを持っている(すなわちエラー報告をオンにしている)ファイル/プログラム(通常 "genwrap.php"と呼ぶ)を作成し、それに私が実際に欲しいページも含みますコール。

このデバッグを実装するには2つのステップがあります。

One - genwrap.phpを作成し、このコードをその中に入れます。

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

2 - デバッグしたいプログラム/ページへのリンクをgenwrap.php経由で変更する。

例:変更:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */
0
kris

上記の非常に多くの優れた答えに加えて、あなたはあなたのプロジェクトに次の2つの機能を実装することもできます。アプリケーションやスクリプトが終了する前に、それらはすべての非構文エラーをキャッチします。関数内では、バックトレースを実行して、快適な「サイトはメンテナンス中です」というメッセージを一般に公開または記録することができます。

致命的なエラー:

register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

エラー:

set_error_handler

http://php.net/manual/en/function.set-error-handler.php

バックトレース:

debug_backtrace

http://php.net/manual/en/function.debug-backtrace.php

0
Vladimir Ramik