PHPでのプログラミングは非常にイライラするものです。かなり頻繁にスクリプトを実行して空白の画面に戻ります。エラーメッセージは表示されず、画面が空になるだけです。原因は、単純な構文エラー(角かっこが間違っている、セミコロンがない)、関数呼び出しが失敗した、またはその他の原因が考えられます。
何が悪かったのかを把握するのは非常に困難です。コードをコメントアウトしたり、いたるところに "echo"ステートメントを入力したりするなどして、問題を絞り込みます。しかし、もっと良い方法があるはずですよね。
それで、Javaのように有用なエラーメッセージを生成するためにPHPを取得する方法はありますか?誰でも良いPHPデバッグのヒント、ツール、テクニックを勧めますか?
構文エラーの場合は、php.iniでエラー表示を有効にする必要があります。 「顧客」にエラーメッセージが表示されたくないため、デフォルトではこれらはオフになっています。 PHPドキュメントの2つのディレクティブerror_reporting
とdisplay_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/
以下はすべてのエラーを有効にします。
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
次のリンクも参照してください。
デバッグしたいファイルに次の行を含めることができます。
error_reporting(E_ALL);
ini_set('display_errors', '1');
これはphp.iniのデフォルト設定を上書きします。これはPHPにエラーをログに報告させるだけです。
php.ini に2つのエントリがエラーの出力を指示します。
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エントリを変更できます。つまり、スクリプトが実行されたときに実行されます。甘い!
error_reporting(E_ALL);
ini_set("display_errors", "On");
この2行は、上記のようにphp.iniエントリを変更したのと同じ効果があります。驚くばかり!
つまり、スクリプトは実行されていません。これは通常、構文エラーがあるときに起こります。
構文エラーがあると、スクリプトは実行時間に到達しません。 compile timeで失敗します。これはphp.iniの値を使用することを意味します。変更していない場合はエラーを表示できない可能性があります。
さらに、PHPはデフォルトでエラーを記録します。共有ホスティングでは、それは専用のフォルダまたは問題のあるスクリプトと同じフォルダにあります。
Php.iniにアクセスできる場合は、error_log
エントリの下にあります。
" xdebug "と呼ばれる本当に便利な拡張子があります。これはあなたのレポートをとても良くするでしょう。
素早い、実地のトラブルシューティングのために、私は通常ここにここで提案します:
error_reporting(~0); ini_set('display_errors', 1);
トラブルシューティングの対象となっているスクリプトの冒頭に置かれます。これは完璧ではありません。完璧な変種はphp.ini
でそれを有効にし、構文エラーと起動エラーを捕らえるためにPHPにエラーを記録することです。
ここに概説されている設定は、どのPHPバージョンに関係なく、すべてのエラー、通知、および警告を含みます。
考慮すべき次のこと:
また見なさい:
あなたが超クールなら、あなたは試すかもしれません:
$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%については、これは問題にはなりません。
ページ上部のパラメータを選択してください
error_reporting(E_ERROR | E_WARNING | E_PARSE);
これを持続させて快適にするために、php.iniファイルを編集することができます。通常は/etc/php.ini
または/etc/php/php.ini
に格納されていますが、ホスティングプロバイダの設定ガイドラインによっては、よりローカルなphp.ini
によって上書きされる場合があります。一番上のLoaded Configuration File
のphpinfo()
ファイルをチェックして、どのファイルが最後にロードされるかを確認してください。
そのファイルでdisplay_errorsを検索してください。 3つのインスタンスのみがあり、そのうち2つはコメント化されています。
コメント解除された行を次のように変更します。
display_errors = stdout
Nette Tracy PHPのエラーと例外のより良い視覚化のために:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
さらに、 xdebug を使ってより詳細な情報を得ることができます。
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL | E_STRICT);
そしてphp.iniの表示エラーをオンにする
あなたは自分の エラーハンドラ を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');
これを試してみてください PHPエラー報告リファレンスツール 。これは非常に優れた視覚的な参照であり、複雑なエラー報告メカニズムを理解するのに役立ちました。
コードエディタとしてPHPStormを試してみるのもよいでしょう。エディタに入力しているときに、PHPやその他の構文エラーが多数見つかります。
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;
}
あなたがubuntuユーザーであるならば、あなたの端末に行き、このコマンドを実行してください
Sudo tail -50f /var/log/Apache2/error.log
最近の50件のエラーが表示されます。すべてのエラーを記録するApache2用のエラーファイルerror.log
があります。
FirePHP も便利です。
「エラー」は、開発者が自分の間違いを知り、それらを解決してシステムを完璧に動作させるための最も有用なものです。
PHPは、開発者に自分のコードがエラーを発生させる理由と場所を知るためのより優れた方法をいくつか提供します。
すべてのエラーメッセージを取得するために、スクリプトの先頭に次の2行を書くための最良の方法:
error_reporting(E_ALL);
ini_set("display_errors", 1);
IDEで xdebug などのデバッガツールを使用するもう1つの方法。
完全なエラー報告を有効にするには、これをスクリプトに追加します。
error_reporting(E_ALL);
これにより、最小限の警告が表示されます。そして、念のために:
ini_set('display_errors', '1');
エラーの表示を強制します。実稼働サーバーではこれをオフにする必要がありますが、開発中の場合はそうしないでください。
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
あなたは完全なエラー報告(通知や厳格なメッセージを含む)を有効にすることができます。冗長すぎると感じる人もいますが、試す価値があります。 php.iniでerror_reporting
をE_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"
この答えは冗長部門の部門によってあなたにもたらされます。
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
Error_displayが無効になっている場合、最後のランタイム通知/警告/エラーを取得するために使用できます。
最後のPHP実行時メッセージも含まれているスーパーローカル変数です。
isset()
が始まった!
私はこれが多くの人々を不快にさせることを知っていますが、 isset
と empty
は ではない 初心者には使われるべきです。あなたは通知抑制を追加することができます after あなたはあなたのコードが動いていることを確認しました。しかし、これまでにない。
最近起きた「うまくいかない」質問の多くは、次のようなタイプミスの結果です。
if(isset($_POST['sumbit']))
# ↑↑
あなたのコードがisset
empty
/array_keys_exists
で散らばっているならば、あなたはどんな有用な通知も得ないでしょう。 @
を使用する方が賢明な場合があるので、少なくともログには注意と警告が表示されます。
assert_options(ASSERT_ACTIVE|ASSERT_WARNING);
assert()
セクションに関する警告を受け取るため。 (非常に珍しいが、もっと熟練したコードにはいくつか含まれるかもしれません。)
PHP 7ではphp.iniに zend.assertions=1
が必要です。
厳密に型付けされた言語にPHPを曲げても、多くの論理エラーを修正することはできませんが、デバッグ目的のためのオプションです。
PDO/MySQLi
@Philは既に PDO/MySQLiエラー報告 オプションについて言及しています。他のデータベースAPIにも同様のオプションがあります。
json_last_error()
+ json_last_error_msg
JSON構文解析用です。
正規表現用です。
カール要求をデバッグするには、少なくともCURLOPT_VERBOSEが必要です。
同様に、シェルコマンドを実行してもエラーが発生することはありません。あなたはいつも2>&1
が必要で、$ errnoを覗いてみてください。
ここにあるすべての素晴らしい答えに加えて、MySQLiおよびPDOライブラリについて特別に言及したいと思います。
のために...
最善の選択肢は、ライブラリを 例外をスローするように設定することです .
スクリプトの先頭近くにこれを追加してください
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
これはnew mysqli()
またはmysqli_connect()
を使う前に置くのが一番です。
接続インスタンスで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);
Kintを使用してください。それはステロイドのデバッグコマンドの組み合わせです。 https://kint-php.github.io/kint/ それはNette Tracyと非常によく似ています
http://todell.com/debug も便利です。プロダクションモードでも、オブジェクトの値を確認したり、デバッグエラーを発生させたりすることができます。
エラー報告を有効にすることは正しい解決策ですが、それを有効にしたプログラムでは効果がないようですが、その後に含まれるプログラムでのみ効果があります。
したがって、私はいつもここでポピュラーな解決策と本質的に同じコードを持っている(すなわちエラー報告をオンにしている)ファイル/プログラム(通常 "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¶m=val').done(function(data) { /* ... */
上記の非常に多くの優れた答えに加えて、あなたはあなたのプロジェクトに次の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