PHP 오류를 표시하려면 어떻게합니까?


1731

PHP ini 파일 ( php.ini)을 확인했으며 display_errors설정되었으며 오류보고 기능도 E_ALL있습니다. Apache 웹 서버를 다시 시작했습니다.

이 줄을 스크립트 맨 위에 놓았으며 간단한 구문 분석 오류도 잡지 않습니다. 예를 들어, 변수를 a로 선언 "$"하고 문을 닫지 않습니다 ";". 그러나 모든 스크립트는 이러한 오류에 빈 페이지를 표시하지만 실제로 브라우저 출력에서 오류 를 보고 싶습니다 .

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

해야 할 일은 무엇입니까?


8
나는 이것이 왜 때때로 작동하고 다른 것들이 작동하는지 정확하게 파악하지는 못했지만 PHP 스크립트에서 오류를 빠르게 토글 (또는 $_REQUEST매개 변수 를 통해 오류를 활성화)하려는 사람들에게는 이 두 줄이 대부분 작동합니다.
— brandonscript

php ini 파일에서 xdebug를 활성화하면 오류에 대한 세부 정보를 볼 수 있습니다.
— jewelhuq

다음은 주제를 다루는 간단한 기사입니다.- blog.phplogger.com
— 2019/

답변:


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
또한이 세 줄을 사용한 다음 include ( 'fileImWorkingOn.php');를 사용할 수 있습니다. 그러면 구문 오류도 잡을 수 있습니다!
— 스냅

14
SysOps는 아니지만 php.ini보다 .htaccess 파일을 가진 사람이 더 많다고 생각합니다. php_flag display_errors 1.htaccess
— Ryan Taylor

1
이제 오류가 기록되었으므로 어디로 이동합니까? / var / log / apache2로 이동하면 모든 로그가 표시되지만 최근에 실행 한 프로그램에 대한 정보는 없습니다. 매일 아침 한 번만 시스템 재시작에 대한 정보를 얻습니다.
— Michael

1
@Michael 오류가 화면 또는 출력으로 바로 이동됩니다.
— Fancy John

2
E_ALLPHP 5.3에서 모든 오류 를 표시하기에 충분하지 않습니다 . " E_STRICT의 일부가되었다 E_ALL5.4.0에서"- PHP 매뉴얼 당신이 필요 E_ALL | E_STRICT하거나 -1해당 버전에.
— Gerard Roche

155

실제로 실행하기 전에 파일을 구문 분석하기 때문에 런타임에 오류 출력을 활성화하면 구문 분석 오류를 포착 할 수 없습니다 (이 과정에서 오류가 발생하면 아무것도 실행되지 않습니다). display_errors가 켜져 있고 적절한 error_reporting 수준이 사용되도록 실제 서버 구성을 변경해야합니다. php.ini에 액세스 할 수없는 경우 서버에 따라 .htaccess 또는 이와 유사한 것을 사용할 수 있습니다.

이 질문 은 추가 정보를 제공 할 수 있습니다.


2
몰랐어요 php.ini 파일을 수동으로 편집했으며 현재 작동 중입니다. 감사!
— Abs

143

php.ini 내부 :

display_errors = on

그런 다음 웹 서버를 다시 시작하십시오.


7
+ ①. 내 우분투에서 /etc/php5/apache2/php.ini
— m93a

5
에 대한 재시작 (데비안, 우분투 등)sudo service apache2 restart
— 피터 크라우스

4
OS X에서 다시 시작하십시오 sudo apachectl -k restart.
— Pea

3
재미있는 사실 : 단순히 phpinfo ()에 넣으면로드 된 php.ini 파일을 찾을 수 있습니다. 빈 PHP 파일로. 그것은 7 번째 줄입니다Loaded Configuration File
— Frankenmint

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

그렇지 않으면, 그 두 줄을 실행할 수 없습니다!

명령 줄에서 다음을 실행하여 스크립트에서 구문 오류를 확인할 수 있습니다.

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

일부 웹 호스팅 제공 업체를 통해 .htaccess파일 에서 PHP 매개 변수를 변경할 수 있습니다 .

다음 줄을 추가 할 수 있습니다.

php_value display_errors 1

나는 당신과 같은 문제가 있었고이 솔루션은 그것을 고쳤다.


그리고 nginx 환경에 있다면 위치 ~ \ .php 지시문 아래의 사이트 (사용 가능한 사이트) 구성에 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);있습니다..
— Frank Forte

@ ballangddang, PHP 7.0에서 문제가 발생하여 try / catch 블록을 사용하고 특히 catch하는 오류가 표시되는 유일한 방법 Error입니다. JavaScript, CSS, Images 등을 제외한 모든 요청을 index.php 파일에 다시 쓰면 try catch 블록이 있으면 더 쉬워집니다. 그렇습니다. 단일 진입 점이없는 시스템은 업데이트하기가 쉽지 않습니다.
— Frank Forte

PHP는 처리되지 않은 예외를 보여주지 않습니까? 확실 해요?
— Martin Tournoij 2016 년

처리되지 않은 예외를 표시해야합니다. 시작시 출력 버퍼를 켜면 (응답 본문을 마지막으로 플러시하기 전에 언제든지 헤더를 보낼 수 있음) 예외 메시지가 어딘가에서 손실 될 수 있습니다.
— Frank Forte

33

이것은 작동합니다 :

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>

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-error_reporting ()을 방문하십시오 .


2
Fancy John의 답변 과 다른 점은 무엇입니까?
— 모든 근로자가 필수적

@cpburnz-간단한 질문이며, 모든 차이점은 유일한 차이점과 동일한 코드 세트가 있습니다. PHP 오류에 대한 자세한 정보를 제공하는 URL 링크를 추가로 제공했습니다.
— B.Balamanigandan 2016 년

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를 사용하는 것은 매우 나쁜 생각입니다. 예를 들어 2047과 같이 2의 거듭 제곱 1을 사용하십시오!
— peterh-복원 모니카

당신은 절대적으로 맞습니다, @peterh! 모든 오류를보고 할 수 있으므로 E_ALL로 변경했습니다 (php 5.4 이하의 엄격한 오류 제외).
— jxmallett

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.');
    }
}


14

당신은 어떻게 든 당신을 통해 설정을 modifiy 수없는 상황에서 자신을 찾을 경우 php.ini또는 .htaccessPHP 스크립트 구문 분석 오류가있을 때 표시 오류 운입니다. 그런 다음 명령 줄에서 다음 과 같이 파일 을 정리해야합니다 .

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'더 간단하다
— 스콘

14

이제 PHP 7을 실행하고 있으므로 여기에 주어진 답변이 더 이상 정확하지 않습니다. Frank Forte의 PHP 7에 대한 이야기 는 여전히 그렇습니다 .

다른 한편으로는 try / catch로 오류를 잡으려고 시도하는 대신 트릭을 사용할 수 있습니다. include를 사용하십시오.

다음은 세 가지 코드입니다.

파일 : 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을 포함하십시오. 당신은 볼 것이다 :

구문 분석 오류 : 구문 오류, 예기치 않은 파일 끝, 4 행의 tst3.php에서 변수 (T_VARIABLE) 또는 $ {(T_DOLLAR_OPEN_CURLY_BRACES) 또는 {$ (T_CURLY_OPEN) 예상


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(Error $e)
— Frank Forte


4

그것이 내가 배운 것입니다. PHP.INI 파일에서

error_reporting = E_ALL
display_errors = On

2
변경? 추가 하시겠습니까?
— 피터 Mortensen

atm 당신의 대답은 문맥이 부족하기 때문에 의미가 없습니다. Peter Mortensen에 의해 규정되었습니다. 그것을 개선하지 않으면 "제거 용 깃발"(봇에 의해)을 준비합니다. (저품질 검토에서).
— 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 스크립트 (hashbang #!/usr/bin/php)입니다. 이 방법으로 파일의 PHP 오류를 리디렉션 할 수 있습니다. 이것은 유닉스 파이핑입니다. 이것은 CGI로 PHP가 아닙니다.
— NVRM

0

이 명령 행에있는 경우, 당신은 실행할 수 php와 -ddisplay_errors=1의 설정을 무시하는 php.ini:

php -ddisplay_errors=1 script.php

-1

PHP 스크립트 의 php.ini및 ini_set()함수 외에도 아래에 표시된 .htaccess및 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

googling little bit 로이 답변을 찾았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.