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 = Onphp.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.iniini_set()함수 외에도 아래에 표시된 .htaccesshttpd.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.