PHPエラーを表示するにはどうすればよいですか?


1731

PHPのiniファイル(php.ini)を確認しましたが、display_errors設定されており、エラー報告も行われていますE_ALL。Apacheウェブサーバーを再起動しました。

これらの行をスクリプトの先頭に配置しましたが、単純な解析エラーも検出できません。たとえば、変数をaで宣言し、"$"ステートメントを閉じません";"。しかし、すべてのスクリプトでこれらのエラーについて空白のページが表示されますが、ブラウザーの出力で実際にエラーを確認したいと思います。

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

やるべきことは何ですか?


8
私はまだこれが時々機能し、他では機能しない理由を正確に特定していませんが、phpスクリプトのエラーをすばやく切り替えたい(または$_REQUESTパラメーターでエラーを有効にしたい)場合、これらの2行はほとんどの場合機能します。
brandonscript 2013年

php iniファイルからxdebugを有効にすると、エラーの詳細を確認できます。
jewelhuq 2016年

これはトピックをカバーする簡単な記事です-blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

回答:


3200

これは常に私にとってはうまくいきます:

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

ただし、これはPHPに解析エラーを表示させません。これらのエラーを表示する唯一の方法は、次の行でphp.iniを変更することです。

display_errors = on

(にアクセスできない場合はphp.ini、この行を.htaccess挿入しても機能する可能性があります):

php_flag display_errors 1

9
また、これらの3行を使用して、include( 'fileImWorkingOn.php');を使用できることにも注意してください。次に、構文エラーをキャッチすることもできます!
スナップ

14
私はSysOpsではありませんが、php.iniよりも多くの人が.htaccessファイルを持っていると思います。これらは両方とも解析前に来るでしょう?php_flag display_errors 1.htaccessの場合
Ryan Taylor

1
エラーがログに記録されたので、どこに行きますか?/ var / log / apache2に移動すると、すべてのログが表示されますが、最近実行したプログラムに関する情報はありません。システムの再起動に関する情報を毎朝1回だけ取得します。
マイケル

1
@Michaelエラーは画面または出力のリダイレクト先に送られます
Fancy John

2
E_ALLPHP 5.3ですべてのエラーを表示するには不十分です。「5.4.0のE_STRICT一部になった」E_ALL-PHP マニュアルE_ALL | E_STRICTまたは-1そのバージョンが必要です。
ジェラールロシュ

155

実行時にエラー出力を有効にすると、解析エラーをキャッチできません。実際に何かを実行する前にファイルを解析するためです(この間にエラーが発生するため、何も実行されません)。実際のサーバー構成を変更して、display_errorsがオンになり、適切なerror_reportingレベルが使用されるようにする必要があります。php.iniにアクセスできない場合は、サーバーによっては.htaccessなどを使用できる場合があります。

この質問は追加情報を提供する場合があります。


2
それを知りませんでした。私はphp.iniファイルを手動で編集しましたが、現在は機能しています。ありがとう!
Abs

143

php.ini内:

display_errors = on

次に、Webサーバーを再起動します。


7
+①。私のubuntu /etc/php5/apache2/php.iniで
m93a

5
以下のための再起動(Debianのは、Ubuntuなど)sudo service apache2 restart
ピーター・クラウス

4
OS Xでの再起動用sudo apachectl -k restart
Pea

3
おもしろい事実:単純にphpinfo()に入れれば、読み込まれたphp.iniファイルを見つけることができます。空のphpファイルに。それは下から7番目の列で、呼び出されますLoaded Configuration File
フランケンミント2016

cPanelでphpコードdirecltyを記述している場合、どうすればよいですか?
arqam

98

すべてのエラーを表示するには、次のことを行う必要があります。

1.ブラウザから呼び出すPHPスクリプトに次の行を含めます(通常はindex.php):

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

2.(a)このスクリプトに構文エラーがないことを確認します

—または—

2.(b)の設定display_errors = Onで、あなたのphp.ini

そうでなければ、それはそれらの2行を実行することさえできません!

(コマンドラインで)を実行して、スクリプトの構文エラーを確認できます。

php -l index.php

あなたがいる場合などが別のPHPスクリプトからスクリプトを、それがされますに、構文エラーを表示含まれたスクリプト。例えば:

index.php

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

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser

51

一部のWebホスティングプロバイダーでは、.htaccessファイル内のPHPパラメーターを変更できます。

次の行を追加できます。

php_value display_errors 1

私はあなたと同じ問題があり、この解決策でそれを修正しました。


nginx環境の場合は、場所〜\ .phpディレクティブの下のサイト(sites-available)構成にphp値を追加します。fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis

40

「エラー報告」または「表示エラー」のすべての設定がPHP 7では機能しないように見える場合があります。これは、エラー処理が変更されたためです。代わりにこれを試してください:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

または、例外とエラーを一度にキャッチするには(これはPHP 5との下位互換性がありません):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

1
PHP7かPHP7.1ですか?検証の答えが提案されているように私が試した、それは動作しますが、私はあなたが少し違う何かIMHO、確かに「いいえ、下位互換性」を提案していると思うと、あなたは完全なPHP <7コードと追加する必要が変更する必要があれば、私が混乱していますtry{} catch() {}どこにでもコードをあなたすでに定義されているPHPコードでは、私も..になるだろう混乱を考えたくはありません
vdegenne

@FancyJohn、これは役に立ちます: $bt = debug_backtrace(); print_r($bt);
フランクフォルテ

@ballangddang、私はPHP 7.0で問題に遭遇しました。ここでエラーを表示する唯一の方法は、try / catchブロックを使用して具体的にをキャッチすることErrorでした。すべてのリクエスト(JavaScript、CSS、画像などを除く)をindex.phpファイルに書き直し、そこにtry catchブロックを置くと、簡単になります。はい。エントリポイントが1つもないシステムは、更新するのに大きな頭痛の種になるでしょう。
フランクフォルテ

PHPは未処理の例外を表示しませんか?それはかなり確かですか?
Martin Tournoij 2017年

未処理の例外が表示されます。最初に出力バッファーをオンにすると(応答本文を最終的にフラッシュする前にいつでもヘッダーを送信できるようにするため)、例外メッセージがどこかで失われる可能性があります。
フランクフォルテ


33

使用する:

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

これが最も良い方法ですが、構文エラーは空の出力を生成するため、コンソールを使用して構文エラーをチェックします。PHPコードをデバッグする最良の方法は、コンソールを使用することです。以下を実行します。

php -l phpfilename.php

22

これをindex.phpファイルに設定します。

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

20

PHPファイルが存在するフォルダーにphp.iniというファイルを作成します。

php.ini内に次のコードを追加します(簡単なエラー表示コードを指定しています)。

display_errors = on

display_startup_errors = on

18

PHPスクリプトは次のとおりです。

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

PHPエラーの詳細については、PHPエラー-error_reporting()をご覧ください。


2
これはファンシージョンの回答とどう違うのですか?
すべての労働者は必須

@cpburnz-それは単純明快な質問であり、誰もが唯一の違いであるフレーバーで同じコードセットを与えられました。PHPエラーに関する詳細情報を提供するURLリンクを追加しました。
B.Balamanigandan

15

上記のすべての回答に従っても(またはphp.iniファイルを編集できない場合)、それでもエラーメッセージが表示されない場合は、エラーレポートを有効にする新しいPHPファイルを作成してから、問題のファイルを含めてください。例えば:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

php.iniファイルにすべてが正しく設定されているにもかかわらず、これが名前空間エラーをキャッチできる唯一の方法でした。私の正確なシナリオは:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

1
いいえ、エラー報告はログレベルではなく、ビットフィールドです。999999を使用するのは非常に悪い考えです。2のべき乗マイナス1、たとえば2047を使用してください!
peterh-モニカを復活させる

@peterhさん、完全に正しいです!E_ALLに変更しました。これにより、すべてのエラーの報告が可能になります(php 5.4以下の厳密なエラーを除く)。
jxmallett 2018

15

私は通常、単純なPHPプロジェクトでは次のコードを使用します。

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

15

PHPをApacheモジュールとして使用する場合、Apache構成ファイル(httpd.confなど)および.htaccessファイルのディレクティブを使用して構成設定を変更できます。これを行うには、「AllowOverride Options」または「AllowOverride All」権限が必要です。

これをチェックして

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess


リンクが壊れています(404)。
Peter Mortensen

14

PHPスクリプトに解析エラーが含まれているときに、設定を変更できない、php.iniまたは.htaccessエラーを表示できない場合があります。その後、次のようにコマンドラインでファイルリントするように解決する必要があります

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

ホストがロックダウンされているためにphp.iniまたは.htaccessを介して値を変更できない場合は、を介して値を変更することもできませんini_set。次のPHPスクリプトで確認できます。

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'シンプルです
スコーン2017年

14

現在PHP 7を実行しているため、ここで与えられた答えはもはや正しくありません。PHP 7について語るフランクフォルテの問題はまだ大丈夫です。

反対に、try / catchでエラーをキャッチするのではなく、インクルードを使用するトリックを使用できます。

ここに3つのコードがあります:

ファイル:tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

これをPHP 7で実行しても何も表示されません。

今、これを試してください:

ファイル:tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

ファイル:tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

次に、エラー報告を設定するtst2を実行してから、tst3を含めます。表示されます:

解析エラー:構文エラー、予期しないファイルの終わり、予期される変数(T_VARIABLE)または$ {(T_DOLLAR_OPEN_CURLY_BRACES)または{$(T_CURLY_OPEN)in tst3.php in line 4


13

以下のようなことができます:

メインインデックスファイルに以下のパラメーターを設定します。

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

次に、要件に基づいて、表示するものを選択できます。

以下のために、すべてのエラー、警告および注意事項:

    error_reporting(E_ALL); OR error_reporting(-1);

以下のためのすべてのエラー:

    error_reporting(E_ERROR);

すべての警告について:

    error_reporting(E_WARNING);

すべての通知について:

    error_reporting(E_NOTICE);

詳細については、こちらをご覧ください


「メインインデックスファイル」とは何ですか?ファイルindex.html
Peter Mortensen

12

追加のデバッグ情報を提供できる独自のカスタムエラーハンドラーを追加できます。さらに、情報をメールで送信するように設定することもできます。

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

7

上にあるこのコードは動作するはずです:

error_reporting(E_ALL);

ただし、ファイルの電話でコードを編集してみてください。

error_reporting =on

6

クイックデバッグの場合に使用できる最良/簡単/高速なソリューションは、例外をキャッチしてコードを囲むことです。これは、プロダクションで高速に何かをチェックしたいときに私がやっていることです。

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

php7の場合、catch (Throwable $e)より良い...またはその下の別のcatchブロックcatch(Error $e)
Frank Forte


4

それが私が学んだことです。PHP.INIファイルで、

error_reporting = E_ALL
display_errors = On

2
変わりますか?追加しますか?
Peter Mortensen

atmあなたの答えはコンテキストが不足しているため意味がありません。ピーター・モーテンセンによっても規定されました。改善しないと、「ボットによる削除」のフラグが立てられます。(低品質レビューから)。
ZF007

4
    <?php
    // Turn off error reporting
    error_reporting(0);

    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);

    // Report all errors
    error_reporting(E_ALL);

    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);

    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

サイトがphp.ini稼働している間は、セキュリティ上の理由から、ファイルでdisplay_errorsを無効にする必要があります。ただし、開発環境では、display_errorsを有効にしてトラブルシューティングを行うことができます。


4

これを行うには、php.iniファイルを変更して以下を追加します。

display_errors = on
display_startup_errors = on

または、これは常に私のために働くので、次のコードを使用することもできます

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

3

あなたがしている場合はXdebugがインストールされますが、設定により、すべての設定を上書きすることができます:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

タイプ:int、デフォルト値:0、Xdebugで導入> = 2.3この設定を1に設定すると、PHPのdisplay_errorsの設定に関係なく、常にエラーが表示されます。

force_error_reporting

タイプ:int、デフォルト値:0、Xdebugで導入> = 2.3この設定は、error_reportingのようなビットマスクです。このビットマスクは、表示する必要があるエラーを特定するために、error_reportingで表されるビットマスクと論理ORされます。この設定はphp.iniでのみ行うことができ、アプリケーションがini_set()で何をしても、特定のエラーを強制的に表示できます。


3

あなたはこのコードを使いたいかもしれません:

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

2

E_NOTICEを除くすべてのエラーを報告する

error_reporting(E_ALL & ~E_NOTICE);

すべてのPHPエラーを表示する

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

すべてのエラー報告をオフにする

error_reporting(0);

1

Unix CLIでは、エラーのみをファイルにリダイレクトするのが非常に実用的です

./script 2> errors.log

次に、別のシェルから、ライブ変更のために:

tail -f errors.log

または単に

watch cat errors.log

これはPHPに関するこの質問にどのように答えますか?
Peter Mortensen

./scriptphp CLIスクリプト(ハッシュバング#!/usr/bin/php)です。この方法で、phpエラーをファイルにリダイレクトできます。これはUNIXの配管です。これはCGIとしてのphpではありません。
NVRM

0

コマンドラインにある場合は、を実行php-ddisplay_errors=1て、の設定を上書きできますphp.ini

php -ddisplay_errors=1 script.php

-1

PHPスクリプトのphp.iniand ini_set()関数以外に、以下に示す.htaccessand httpd.confディレクティブを使用して同じことを行うことができます。

一部のホスティングプロバイダーでは、.htaccessおよびを介してPHP設定を設定できますhttpd.conf

PHPエラーを非表示にする

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

少しググリングしてこの答えを見つけました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.