IT story

PHP에서 유용한 오류 메시지를 얻는 방법은 무엇입니까?

hot-time 2020. 2. 9. 19:26
반응형

PHP에서 유용한 오류 메시지를 얻는 방법은 무엇입니까?


PHP로 프로그래밍하는 것이 상당히 실망 스럽습니다. 나는 종종 스크립트를 실행하고 빈 화면을 다시 보게됩니다. 빈 화면으로 오류 메시지가 없습니다. 원인은 단순한 구문 오류 (잘못된 대괄호, 세미콜론 누락) 또는 함수 호출 실패 또는 기타 다른 것일 수 있습니다.

무엇이 잘못되었는지 알아내는 것은 매우 어렵습니다. 코드를 주석 처리하고, 어디서나 "echo"문장을 입력하는 등 문제를 좁히려 고합니다. 그러나 더 좋은 방법이 있어야합니다.

그렇다면 Java와 마찬가지로 PHP가 유용한 오류 메시지를 생성하는 방법이 있습니까? 누구나 좋은 PHP 디버깅 팁과 기술을 추천 할 수 있습니까?


구문 오류의 경우 php.ini에서 오류 표시를 활성화해야합니다. 오류 메시지가 표시되는 "고객"을 원하지 않기 때문에 기본적으로이 기능은 해제되어 있습니다. 이 페이지를 확인 2 개 지침에 대한 자세한 내용은 PHP 문서에서 : 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) 다음 두 줄을 추가하면 구문 오류가 아닌 오류를 디버깅하는 데 도움이됩니다.

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

(3) 다른 옵션은 입력 할 때 PhpEd 와 같은 오류를 확인하는 편집기를 사용하는 입니다. PhpEd에는 더 자세한 정보를 제공 할 수있는 디버거도 제공됩니다. PhpEd 디버거는 xdebug와 매우 유사하며 편집기에 직접 통합되므로 하나의 프로그램을 사용하여 모든 작업을 수행 할 수 있습니다.

Cartman의 링크 도 매우 좋습니다 : 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 설정

php.ini의 2 개의 항목 은 오류 출력을 나타냅니다.

  1. display_errors
  2. error_reporting

에서 생산 , display_errors일반적으로 설정됩니다 Off(생산 현장에서 에러 표시가 일반적으로 바람직하지 않기 때문에, 좋은 일 어느!).

그러나 개발 에서는 On오류가 표시되도록 로 설정해야합니다 . 확인하세요 !

error_reporting(PHP 5.3부터)는 기본적으로 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(즉, 통지, 엄격한 표준 및 사용 중단 통지를 제외한 모든 것이 표시됨 )로 설정되어 있습니다. 확실하지 않은 경우 모든 오류 E_ALL를 표시 하도록 설정하십시오 . 확인하세요 !

우와 우와! 확인 안함! 내 php.ini를 변경할 수 없습니다!

부끄러운 일입니다. 일반적으로 공유 호스트는 php.ini 파일을 변경할 수 없으므로 해당 옵션을 사용할 수 없습니다. 그러나 두려워하지 마십시오! 우리는 다른 옵션이 있습니다 !

런타임 구성

원하는 스크립트에서 런타임에 php.ini 항목을 변경할 수 있습니다! 즉, 스크립트가 실행될 때 실행됩니다! 단!

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

이 두 줄은 위와 같이 php.ini 항목을 변경하는 것과 동일한 효과를 나타냅니다! 대박!

여전히 빈 페이지 / 500 오류가 발생합니다!

그것은 스크립트가 실행되지 않았 음을 의미합니다! 일반적으로 구문 오류가있을 때 발생합니다!

구문 오류로 인해 스크립트가 런타임에 도달하지도 않습니다. 컴파일 타임에 실패합니다 . 즉, php.ini의 값을 사용하면 변경하지 않은 경우 오류 표시가 허용되지 않을 수 있습니다.

오류 로그

또한 PHP는 기본적으로 오류를 기록합니다. 공유 호스팅에서는 전용 폴더 또는 문제가되는 스크립트와 같은 폴더에있을 수 있습니다.

php.ini에 액세스 할 수 있으면 error_log항목 아래에서 찾을 수 있습니다 .


" xdebug " 라는 정말 유용한 확장 기능 이있어 보고서를 훨씬 멋지게 만들 수 있습니다.


빠른 실습 문제 해결을 위해 일반적으로 여기에 제안합니다.

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

문제가 발생한 스크립트의 시작 부분에 배치해야합니다. 이것은 완벽하지는 않습니다. 완벽한 변형은 php.iniPHP에서 오류를 기록하여 구문 및 시작 오류를 포착한다는 것입니다.

여기에 설명 된 설정은 어떤 PHP 버전에 관계없이 엄격한 오류를 포함한 모든 오류,주의 사항 및 경고를 표시합니다.

고려해야 할 다음 사항 :

  • Xdebug를 설치 하고 IDE에서 원격 디버깅을 활성화하십시오.

또한보십시오 :


당신이 매우 시원하다면, 시도해 볼 수 있습니다 :

$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호스팅 제공 업체의 설정 지침에 따라 더 많은 로컬이 이를 덮어 쓸 수 있습니다. 검사 phpinfo()의 파일을 Loaded Configuration File하나가 마지막으로로드되는 어떤 확인하기 위해, 상단에.

해당 파일에서 display_errors를 검색하십시오. 3 개의 인스턴스 만 있어야하며 그 중 2 개는 주석 처리됩니다.

주석 처리되지 않은 행을 다음과 같이 변경하십시오.

display_errors = stdout

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

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

또한 xdebug를 사용 하여 자세한 정보를 얻을 수 있습니다 .


PHP에서 오류 및 예외를 더 잘 시각화하려면 Nette Tracy권장합니다 .

Nette Tracy 스크린 샷


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

FirePHP 도 유용 할 수 있습니다.


PHPStorm을 코드 편집기로 사용해 볼 수도 있습니다. 편집기에 입력하는 즉시 많은 PHP 및 기타 구문 오류가 발생합니다.


PHP에서 유용한 오류를 얻는 데 필요한 두 가지 주요 라인은 다음과 같습니다.

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

다른 기고자들이 지적한 것처럼 보안상의 이유로 기본적으로 꺼져 있습니다. 유용한 팁-사이트를 설정할 때 로컬 및 개발 환경에서 이러한 오류가 기본적으로 설정되도록 다른 환경에 맞게 전환하는 것이 편리합니다. 이것은 다음 코드 (이상적으로 index.php 또는 구성 파일에 있으므로 시작부터 활성화 됨)를 사용하여 얻을 수 있습니다.

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;
}

우분투 사용자 인 경우 터미널로 이동 하여이 명령을 실행하십시오.

sudo tail -50f /var/log/apache2/error.log

최근 50 개의 오류가 표시됩니다. error.log모든 오류를 기록하는 apache2에 대한 오류 파일 이 있습니다.


전체 오류보고 (알림 및 엄격한 메시지 포함)를 활성화 할 수 있습니다. 어떤 사람들은 이것이 너무 장황하다고 생각하지만 시도해 볼 가치가 있습니다. 설정 error_reportingE_ALL | E_STRICTphp.ini 파일에.

error_reporting = E_ALL | E_STRICT

E_STRICT 더 이상 사용되지 않는 기능에 대해 알리고 특정 작업을 수행하는 가장 좋은 방법에 대한 권장 사항을 제공합니다.

통지를 원하지 않지만 다른 메시지 유형이 도움이되는 경우 통지를 제외하십시오.

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

또한 display_errorsphp.ini에서 활성화되어 있는지 확인하십시오 . PHP 버전이 5.2.4보다 오래된 경우 다음과 같이 설정하십시오 On.

display_errors = "On"

버전이 5.2.4 이상인 경우 다음을 사용하십시오.

display_errors = "stderr"

전체 오류보고를 켜려면이를 스크립트에 추가하십시오.

error_reporting(E_ALL);

이로 인해 최소한의 경고 만 표시됩니다. 그리고 만일을 위해서 :

ini_set('display_errors', '1');

오류를 강제로 표시합니다. 프로덕션 서버에서는이 기능을 해제해야하지만 개발 중에는 안됩니다.


error_reporting 및 display_errors ini 설정 외에도 웹 서버의 로그 파일에서 SYNTAX 오류를 얻을 수 있습니다. PHP를 개발할 때 개발 시스템의 웹 서버 로그를 편집기에로드합니다. 페이지를 테스트하고 빈 화면이 표시 될 때마다 로그 파일이 오래되고 편집자가 다시로드할지 묻습니다. 내가 할 때, 나는 맨 아래로 건너 뛰고 구문 오류가 있습니다. 예를 들면 다음과 같습니다.

[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는 개발자가 코드 부분에서 오류가 발생하는 이유와 위치를 알 수있는 더 나은 방법을 제공하므로 이러한 오류를 알면 개발자가 여러 가지 방법으로 코드를 개선 할 수 있습니다.

모든 오류 메시지를 얻기 위해 스크립트 상단에 다음 두 줄을 쓰는 가장 좋은 방법 :

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

IDE에서 xdebug 와 같은 디버거 도구를 사용하는 또 다른 방법 입니다.


여기에있는 모든 훌륭한 답변 외에도 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. ini_set() / php.ini / .htaccess / .user.ini

    설정 display_errors과는 error_reporting이제 충분히 커버하고있다. 그러나 언제 어떤 옵션을 사용해야 할지를 간단히 요약하면 다음과 같습니다.

    • ini_set()error_reporting()런타임 오류에 대해서만 적용됩니다.
    • php.ini개발 설정을 위해 주로 편집해야합니다. (웹 서버와 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() 가라!

    나는이 사람들을 많이 불쾌 알고 있지만, isset그리고 empty해야 하지 이민자에 의해 사용. 코드가 작동하는지 확인한 알림 억제를 추가 할 수 있습니다 . 그러나 결코 전에는.

    최근에 발생하는 많은 "뭔가 작동하지 않는"질문은 다음과 같은 오타의 결과입니다.

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

    코드에 isset/ empty/ 가 포함되어 있으면 유용한 알림이 표시되지 않습니다 array_keys_exists. 때때로 사용하는 것이@합리적 이므로 통지 및 경고는 최소한 로그에 전달됩니다.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    assert()섹션에 대한 경고를받습니다 . (매우 드물지만 더 유능한 코드에는 일부가 포함될 수 있습니다.)

    PHP7은 zend.assertions=1php.ini 에서도 필요합니다 .

  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

    curl 요청을 디버그하려면 최소한 CURLOPT_VERBOSE가 필요합니다.

  11. shell/exec()

    마찬가지로 쉘 명령 실행은 자체적으로 오류를 생성하지 않습니다. 당신은 항상 2>&1$ errno를 필요로 하고 엿 봅니다.


오류보고를 설정하는 것이 올바른 해결책이지만, 오류보고를 설정하는 프로그램에는 영향을 미치지 않지만 이후에 포함 된 프로그램에만 적용됩니다.

따라서 나는 항상 여기에서 인기있는 솔루션과 본질적으로 동일한 코드를 가진 파일 / 프로그램 (일반적으로 "genwrap.php"라고 함) (예 : 오류보고 켜기)을 만들고 실제로 원하는 페이지를 포함합니다 요구.

이 디버깅을 구현하는 데는 2 단계가 있습니다.

하나 -genwrap.php를 생성하고이 코드를 넣습니다 :

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

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

번째-genwrap.php를 통해 디버깅하려는 프로그램 / 페이지의 링크를 변경하십시오.

예 : 변경 :

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

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

위의 매우 훌륭한 답변 외에도 프로젝트에서 다음 두 가지 기능을 구현할 수 있습니다. 응용 프로그램 / 스크립트 종료 전에 구문 이외의 모든 오류를 포착합니다. 기능 내에서 역 추적을 수행하고 대중에게 유쾌한 '사이트가 유지 보수 중입니다'메시지를 기록하거나 렌더링 할 수 있습니다.

치명적인 오류 :

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

참고 URL : https://stackoverflow.com/questions/845021/how-can-i-get-useful-error-messages-in-php



반응형