복붙노트

PHP에서 유용한 오류 메시지를 얻는 방법?

PHP

PHP에서 유용한 오류 메시지를 얻는 방법?

나는 PHP에서 프로그래밍이 매우 실망 스럽다. 꽤 자주 스크립트를 실행하고 빈 화면을 다시 얻으려고 시도합니다. 오류 메시지가 없으며 빈 화면 만 있습니다. 원인은 간단한 구문 오류 (잘못된 대} 호, 누락 된 세 L 콜론) 또는 실패한 함수 호출이거나 완전히 다른 것일 수 있습니다.

무엇이 잘못되었는지 알아내는 것은 매우 어렵습니다. 결국 코드를 ​​주석 처리하고, "에코"문을 사방에 입력하는 등의 문제를 좁히기 위해 노력합니다. 그러나 확실하게 더 나은 방법이어야합니다.

그렇다면 PHP가 Java와 같은 유용한 오류 메시지를 생성 할 수있는 방법이 있습니까? 누구든지 좋은 PHP 디버깅 팁, 도구 및 기법을 추천 할 수 있습니까?

해결법

  1. ==============================

    1.

    구문 오류의 경우 php.ini에서 오류 표시를 활성화해야합니다. 기본적으로이 옵션은 "고객"에게 오류 메시지가 표시되기를 원치 않으므로 해제됩니다. error_reporting 및 display_errors와 같은 두 가지 지시어에 대한 정보는 PHP 문서에서이 페이지를 확인하십시오. 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/

  2. ==============================

    2.

    다음은 모든 오류를 활성화합니다.

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

    또한 다음 링크를 참조하십시오.

  3. ==============================

    3.

    디버깅 할 파일에 다음 행을 포함시킬 수 있습니다.

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

    이것은 php.ini의 기본 설정을 덮어 씁니다. php.ini는 PHP가 로그에 오류를보고하게합니다.

  4. ==============================

    4.

    php.ini의 2 개의 엔트리는 에러의 출력을 지시합니다 :

    프로덕션 환경에서 display_errors는 일반적으로 Off로 설정됩니다 (이는 프로덕션 사이트의 오류 표시가 일반적으로 바람직하지 않기 때문에 좋은 방법입니다).

    그러나 개발 중에는 오류가 표시되도록 On으로 설정해야합니다. 검사!

    error_reporting (PHP 5.3 현재)은 기본적으로 E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED로 설정됩니다 (즉,주의 사항, 엄격한 표준 및 비추천 통지를 제외한 모든 내용이 표시됨). 의심 스럽다면 E_ALL로 설정하여 모든 오류를 표시하십시오. 검사!

    그것은 수치 스럽습니다. 보통 공유 호스트는 php.ini 파일의 변경을 허용하지 않으므로, 그 옵션은 슬프게도 사용할 수 없습니다. 그러나 두려워하지 마라! 다른 옵션이 있습니다!

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

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

    이 두 줄은 위와 같이 php.ini 항목을 변경하는 것과 같은 효과를냅니다! 굉장해!

    즉 스크립트가 실행되지 않았 음을 의미합니다! 이것은 보통 구문 오류가있을 때 발생합니다!

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

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

    php.ini에 접근 할 수 있다면 error_log 항목 아래에서 찾을 수 있습니다.

  5. ==============================

    5.

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

  6. ==============================

    6.

    신속하고 실용적인 문제 해결을 위해 일반적으로 여기에 제안했습니다.

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

    문제 해결중인 스크립트의 시작 부분에 놓습니다. 이것은 완벽하지는 않습니다. 완벽한 변종은 php.ini에서이 기능을 활성화하고 구문 오류 및 시작 오류를 잡기 위해 PHP에서 오류를 기록한다는 것입니다.

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

    고려해야 할 다음 사항 :

    다음을 참조하십시오.

  7. ==============================

    7.

    슈퍼 시원한 경우 시도해보십시오.

    $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 %의 오류에 대해서는 문제가되지 않습니다.

  8. ==============================

    8.

    페이지 상단에서 매개 변수를 선택하십시오.

    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    
  9. ==============================

    9.

    이것을 유지하고 confortale로 만들려면 php.ini 파일을 편집하면됩니다. 일반적으로 /etc/php.ini 또는 /etc/php/php.ini에 저장되지만, 호스팅 제공 업체의 설정 지침에 따라 더 많은 로컬 php.ini 파일이 덮어 쓸 수 있습니다. 맨 위에로드 된 구성 파일에 대한 phpinfo () 파일을 확인하여 마지막으로로드 할 파일이 있는지 확인하십시오.

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

    주석 처리되지 않은 행을 다음으로 변경하십시오.

    display_errors = stdout
    
  10. ==============================

    10.

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

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

  11. ==============================

    11.

    Nette Tracy가 PHP의 오류 및 예외를 더 잘 시각화 할 수 있도록 권장합니다.

  12. ==============================

    12.

    error_reporting(E_ALL | E_STRICT);
    

    그리고 php.ini에서 디스플레이 오류를 켭니다.

  13. ==============================

    13.

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

    14.

    이 PHP 오류보고 참조 도구를 사용해보십시오. 시각적 인 참고 자료로서 복잡한 오류보고 메커니즘을 이해하는 데 도움이되었습니다.

  15. ==============================

    15.

    PHPStorm을 코드 편집기로 사용해 볼 수도 있습니다. 편집기에서 타이핑 할 때 많은 PHP 및 기타 구문 오류를 발견하게됩니다.

  16. ==============================

    16.

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

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

    다른 참여자가 지적한대로 보안상의 이유로 기본적으로 해제됩니다. 유용한 팁 - 사이트를 구축 할 때 여러 환경에서 스위치를 사용하면 로컬 및 개발 환경에서 기본적으로 이러한 오류가 켜지 게되므로 편리합니다. 이것은 다음 코드 (이상적으로 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;
    }
    
  17. ==============================

    17.

    FirePHP도 유용 할 수 있습니다.

  18. ==============================

    18.

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

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

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

  19. ==============================

    19.

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    
  20. ==============================

    20.

    전체 오류보고 (통지 및 엄격한 메시지 포함)를 사용 가능하게 할 수 있습니다. 어떤 사람들은 이것을 너무 장황한 것으로 생각하지만 시도해 볼 가치가 있습니다. error_reporting을 E_ALL로 설정 | php.ini의 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"
    
  21. ==============================

    21.

    전체 오류보고를 사용하려면 스크립트에 다음을 추가하십시오.

    error_reporting(E_ALL);
    

    이로 인해 최소한의 경고까지 표시됩니다. 그리고,

    ini_set('display_errors', '1');
    

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

  22. ==============================

    22.

    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
    
  23. ==============================

    23.

    "오류"는 개발자가 실수를 알고 가장 완벽하게 작동하도록 해결 한 가장 유용한 기능입니다.

    PHP는 개발자에게 왜 코드가 오류를 가져 오는지 알 수있는 더 나은 방법을 제공합니다. 따라서 개발자는 여러 가지 방법으로 코드를 개선 할 수 있습니다.

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

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

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

  24. ==============================

    24.

    오류보고 기능을 켜는 것이 올바른 해결책이지만 프로그램을 실행하는 프로그램에서는 효과가없는 것처럼 보이지만 이후에 포함 된 프로그램에서만 적용됩니다.

    따라서 필자는 항상 내가 일반적으로 "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) { /* ... */
    
  25. ==============================

    25.

    http://todell.com/debug도 유용 할 수 있습니다. 프로덕션 모드에서도 장면 뒤에서 객체 값이나 디버그 오류를 볼 수 있습니다.

  26. ==============================

    26.

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

    치명적인 오류 :

    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

  27. ==============================

    27.

    Kint를 사용하십시오. 그것은 스테로이드에 디버깅 명령의 조합입니다. https://kint-php.github.io/kint/ Nette Tracy와 매우 비슷합니다.

  28. ==============================

    28.

    내 평소 문제는 불행히도 나타나지 않는 "작은, 어리석은"파서 오류입니다.

    그러나 .PHP 파일에 파서 오류가있는 파일이 포함되어 있으면이 파일이 표시됩니다! 그래서 버그가있는 파일의 이름으로 시작되는 작은 "executor-script"를 작성하는 아이디어가있었습니다 (예 : example.com/sx.php?sc=buggy.php).

    그것은 이미 많은 두통에서 나를 구했고 어쩌면 다른 사람에게 도움이 될 것입니다. :)

    sx.php      $ sc = $ _GET [ "sc"]; if ((! isset ($ _GET [ "sc"]) && empty ($ _ GET [ "sc"]))) {     echo "실행 파일을 선택 하시겠습니까? sc = (.PHP 확장자는 생략 할 수 있습니다)"; } else {     $ sc = $ _GET [ "sc"];     if (false == stripos ( '. php', $ sc)) $ sc. = '. php'; 원하는 확장자가 php5 인 경우 // 이것을 조정하십시오!     require ($ sc); } ?>

  29. from https://stackoverflow.com/questions/845021/how-to-get-useful-error-messages-in-php by cc-by-sa and MIT lisence