복붙노트

PHP의 죽음의 흰색 화면

PHP

PHP의 죽음의 흰색 화면

이제 PHP로 돌아 가기 시작 했으므로 왜 처음에 포기했는지 기억하기 시작했습니다. 필자가 지금 내 접시에서 가장 성가신 일은 "PHP의 죽음의 흰색 화면"이라는 용어에 관한 것입니다. PHP가 구문이나 기타로 인해 치명적인 오류가 발생하면 브라우저에 실제로 아무것도 보내지 않고도 항상 죽는 것처럼 보입니다. 나는 .htaccess 파일에 다음을 추가했다. 대부분의 경우 작동하지만,이 경우에는 작동하지 않는다.

php_value display_errors 1
php_value display_startup_errors 1
php_value error_reporting 2147483647 # E_ALL

내가 놓친 게 있니? 지금 내가 쓰는 몇 줄의 코드를 새로 고쳐야 할 필요가있는 것처럼 느껴진다. 나는 실수를해서 많은 실수를 저지르기 위해 많은 페이지를 검색해야한다.

편집 : 예를 들어, 주어진 두 줄의 코드 아래 :

$foo = array(':language' => $languageId;
$foo = array(':language' => $languageId);

첫 번째 화면은 죽음의 흰색 화면 (즉, 브라우저에는 전혀 인쇄되지 않음)을 표시하며, 두 번째 화면은 행복하게 실행됩니다.

해결법

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

    1.

    오류 및 경고는 보통 php.ini 설정에 따라 .... \ logs \ php_error.log 또는 .... \ logs \ apache_error.log에 나타납니다.

    또한 유용한 오류는 종종 브라우저로 보내지지만 유효한 HTML이 아니기 때문에 표시되지 않습니다.

    따라서 "tail -f"로그 파일과 빈 화면이 나타나면 "보기"-> "원본"메뉴 옵션을 사용하여 원시 출력을 봅니다.

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

    2.

    다음 코드는 모든 오류를 표시해야합니다.

    <?php
    
    // ----------------------------------------------------------------------------------------------------
    // - Display Errors
    // ----------------------------------------------------------------------------------------------------
    ini_set('display_errors', 'On');
    ini_set('html_errors', 0);
    
    // ----------------------------------------------------------------------------------------------------
    // - Error Reporting
    // ----------------------------------------------------------------------------------------------------
    error_reporting(-1);
    
    // ----------------------------------------------------------------------------------------------------
    // - Shutdown Handler
    // ----------------------------------------------------------------------------------------------------
    function ShutdownHandler()
    {
        if(@is_array($error = @error_get_last()))
        {
            return(@call_user_func_array('ErrorHandler', $error));
        };
    
        return(TRUE);
    };
    
    register_shutdown_function('ShutdownHandler');
    
    // ----------------------------------------------------------------------------------------------------
    // - Error Handler
    // ----------------------------------------------------------------------------------------------------
    function ErrorHandler($type, $message, $file, $line)
    {
        $_ERRORS = Array(
            0x0001 => 'E_ERROR',
            0x0002 => 'E_WARNING',
            0x0004 => 'E_PARSE',
            0x0008 => 'E_NOTICE',
            0x0010 => 'E_CORE_ERROR',
            0x0020 => 'E_CORE_WARNING',
            0x0040 => 'E_COMPILE_ERROR',
            0x0080 => 'E_COMPILE_WARNING',
            0x0100 => 'E_USER_ERROR',
            0x0200 => 'E_USER_WARNING',
            0x0400 => 'E_USER_NOTICE',
            0x0800 => 'E_STRICT',
            0x1000 => 'E_RECOVERABLE_ERROR',
            0x2000 => 'E_DEPRECATED',
            0x4000 => 'E_USER_DEPRECATED'
        );
    
        if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
        {
            $name = 'E_UNKNOWN';
        };
    
        return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
    };
    
    $old_error_handler = set_error_handler("ErrorHandler");
    
    // other php code
    
    ?>
    

    이 코드로 빈 페이지를 생성하는 유일한 방법은 종료 처리기에 오류가있는 경우입니다. 나는 이것을 테스트하지 않고 내 자신의 CMS에서 복사하고 붙여 넣었지만 제대로 작동한다고 확신합니다.

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

    3.

    난 항상 PHP 스크립트의 맨 위에이 구문을 사용하고 있습니다.

    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 'On');  //On or Off
    
  4. ==============================

    4.

    마지막 오류 또는 경고를 표시 할 수 있도록 후크를 등록 할 수 있습니다.

    function shutdown(){
      var_dump(error_get_last());
    }
    
    register_shutdown_function('shutdown');
    

    index.php의 시작 부분에이 코드를 추가하면 문제를 디버그하는 데 도움이됩니다.

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

    5.

    컴파일이나 파싱 단계에서 문법 오류나 구문 분석 오류가 발생한다는 것을 인식하는 것이 중요합니다. PHP가 코드를 실행하기 전에 보류하게됩니다. 따라서 런타임 중에 PHP의 display_errors 구성을 수정하는 경우 (이는 코드의 ini_set 사용에서 런타임 구성 파일 인 .htaccess 사용까지 포함) 기본로드 된 구성 설정 만 적용됩니다.

    WSOD를 피하려면로드 된 구성 파일에 display_errors가 있고 error_reporting이 -1로 설정되어 있는지 확인해야합니다 (이것은 실행중인 PHP 버전에 관계없이 모든 비트가 켜지도록하므로 E_ALL과 동일합니다). E_ALL의 상수 값은 다른 버전의 PHP 사이에서 변경 될 수 있으므로 하드 코드하지 마십시오.

    로드 된 구성은로드 된 php.ini 파일 또는 apache.conf 또는 httpd.conf 또는 virtualhost 파일입니다. 이러한 파일은 시작 단계 (예 : apache httpd 또는 php-fpm을 처음 시작하는 경우)에서 한 번만 읽을 수 있으며 런타임 구성 변경으로 재정의됩니다. 로드 된 구성 파일에서 display_errors = 1 및 error_reporting = -1을 확인하면 ini_set ( 'display_errors', 1)과 같이 런타임 변경 전에 발생하는 구문 또는 구문 분석 오류와 상관없이 WSOD를 볼 수 없습니다. 또는 error_reporting (E_ALL); 일어날 수 있습니다.

    로드 된 구성 파일을 찾으려면 다음 코드 만 사용하여 새 PHP 파일을 만드십시오 ...

    <?php
    phpinfo();
    

    그런 다음 브라우저를 열어로드 된 구성 파일과 추가 .ini 파일 (일반적으로 phpinfo () 상단에 있음)을 검토하고로드 된 모든 구성 파일의 절대 경로를 포함시킵니다.

    파일 대신 (none)이 표시되면 구성 파일 (php.ini) 경로에 php.ini가 없음을 의미합니다. 따라서 PHP와 함께 번들로 제공되는 php.ini 파일을 여기에서 다운로드 받아이를 php.ini 파일의 구성 파일 경로에 복사 한 다음 PHP 사용자가 해당 파일을 읽을 수있는 충분한 권한을 가지고 있는지 확인하십시오. PHP 파일을로드하려면 httpd 또는 php-fpm을 다시 시작해야합니다. PHP 소스와 함께 번들로 제공되는 개발 용 php.ini 파일입니다. 프로덕션에서 사용하지 마십시오!

    이것은 실제로 개발중인 WSOD를 피하는 가장 좋은 방법입니다. 누구든지 ini_set ( 'display_errors', 1); 또는 error_reporting (E_ALL); PHP 스크립트의 맨 위에 또는 여기에서했던 것처럼 .htaccess를 사용하면로드 된 구성 파일에 display_errors가 해제되어있는 경우 구문 또는 구문 분석 오류가 발생하면 WSOD를 피할 수 없습니다.

    많은 사람들 (및 PHP 설치)은 기본적으로 display_errors가 꺼져있는 production-ini 파일을 사용합니다.이 파일은 여기에서 경험했던 것과 동일한 불만을 나타냅니다. PHP는 이미 시작할 때 꺼져 있기 때문에 구문 또는 구문 분석 오류가 발생하고 출력 할 내용이 없습니다. 당신은 당신의 ini_set ( 'display_errors', 1); PHP 스크립트의 맨 위에있는 코드는 피할 수 있었지만 PHP가 런타임에 도달하지 않았기 때문에 코드를 구문 분석 할 수 없는지는 중요하지 않습니다.

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

    6.

    Dunno가 도움이된다면 여기에 PHP 프로젝트를위한 표준 설정 파일이 있습니다. 나는 내 서버에 아파치 설정에 너무 의존하지 않는 경향이있다.

    나는 사라지는 오류 문제가 결코 없기 때문에 아마도 여기 뭔가가 당신에게 아이디어를 줄 것이다.

    APPLICATON_LIVE을 (를) 수정 함

    /*
    APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
    */
    
    if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
        define('APPLICATION_LIVE', true);
    } elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
        define('APPLICATION_LIVE', false);
    } else {
        die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
        // Log or take other appropriate action.
    }
    
    
    /*
    --------------------------------------------------------------------
    DEFAULT ERROR HANDLING
    --------------------------------------------------------------------
    Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
    */
    error_reporting(E_ALL & ~E_STRICT);
    ini_set ( "display_errors", "0");
    ini_set ( "display_startup_errors", "0");
    ini_set ( "log_errors", 1);
    ini_set ( "log_errors_max_len", 0);
    ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
    ini_set ( "display_errors", "0");
    ini_set ( "display_startup_errors", "0");
    
    if ( ! APPLICATION_LIVE ) {
        // A few changes to error handling for development.
        // We will want errors to be visible during development.
        ini_set ( "display_errors", "1");
        ini_set ( "display_startup_errors", "1");
        ini_set ( "html_errors", "1");
        ini_set ( "docref_root", "http://www.php.net/");
        ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
        ini_set ( "error_append_string", "</div>");
    }
    
  7. ==============================

    7.

    php.ini 파일을 열고, 다음과 같이 설정되어 있는지 확인하십시오.

    display_errors = On
    

    서버를 다시 시작하십시오.

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

    8.

    실제 PHP 파일에서 오류보고 수준을 설정해보십시오. 또는 다른 사람들이 제안한 것처럼 서버 설정을 점검하십시오. 이는 php.ini의 내용 일 수도 있고 호스트의 제한 사항 일 수도 있습니다. .htaccess에만 의지하지 마십시오. 또한 문제를 해결할 때 print_r 변수가 생기게 생각할 수도 있습니다.

  9. ==============================

    9.

    PHP가 실제로 .htaccess에서 'display_errors'설정을 선택하고 있습니까? phpinfo () 함수의 출력을 확인하여 확인하십시오.

    또한 '@'를 사용하지 않았는지 확인해야합니다. 스택 어딘가에 '@include ...'또는 '@some_function (...)'을 사용했다면 오류가 발생할 수 있습니다. 자취.

  10. ==============================

    10.

    일부 응용 프로그램은 다음과 같은 명령어를 직접 처리합니다.

    error_reporting(E_ALL & ~E_DEPRECATED); or error_reporting(0);
    

    따라서 .htaccess 설정을 무시하십시오.

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

    11.

    @inexistent_function_call ()을 사용하여; 코드에서 intepreter가 조용히 죽고 스크립트 파싱을 중단합니다. 잘못된 함수가 있는지 확인하고 오류 억제 연산자 (@ char)를 사용하지 마십시오.

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

    12.

    fastcgi_params 또는 fastcgi.conf 구성 파일이 서버 구성에 제대로 포함되지 않은 경우에도 이러한 오류가 발생했습니다. 그래서 나를위한 해결책은 바보 같았습니다.

    / etc / nginx / fastcgi_params를 포함하십시오.

    그걸 알아 내는데 한 시간 걸렸어.

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

    13.

    다음과 같이 터미널 (명령 행)에서 파일을 실행할 수도 있습니다 : php -f filename.php.

    이렇게하면 코드가 실행되고 error.log에서 볼 수있는 오류가 발생할 경우 동일한 결과가 제공됩니다. 그것은 오류와 행 번호를 언급합니다.

  14. ==============================

    14.

    사람들은 nginx를 사용하고

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    

    이 옵션은 fastcgi_params 파일에 없으므로 PHP가 작동하지 않고 로그에 오류가 없었습니다.

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

    15.

    오류가 PHP 코드에있는 경우 코드 내에서 error_reporting () 함수를 사용하여 보고서를 모두 설정할 수 있습니다.

    그러나 이것은 PHP가 충돌 할 때 상황을 처리하지 않습니다. 정보는 서버 로그에서만 사용할 수 있습니다. 어쩌면 당신은 그것들에 접근 할 수 없지만, 내가 함께 일해 많은 호스팅 제공 업체는 당신이 그것을 액세스하게하는 어떤 방법을 가지고있다. 예를 들어 내가 좋아하는 접근 방식은 .php가있는 현재 디렉토리에 error_log 파일을 생성한다는 것입니다. 검색을 시도하거나 호스팅 제공 업체에 문의하십시오.

  16. from https://stackoverflow.com/questions/1475297/phps-white-screen-of-death by cc-by-sa and MIT lisence