위치 - php 에러 로그 확인




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

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

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

그렇다면 PHP가 Java와 같은 유용한 오류 메시지를 생성 할 수있는 방법이 있습니까? 누구든지 좋은 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 "라는 정말 유용한 확장이있어 보고서를 훨씬 더 멋지게 만들 수 있습니다.


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


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


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

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

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

sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>


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

$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(~0); ini_set('display_errors', 1);

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

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

고려해야 할 다음 사항 :

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

다음을 참조하십시오.


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

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

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

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

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


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


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

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

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

display_errors = stdout

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

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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


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

error_reporting(E_ERROR | E_WARNING | E_PARSE);

FirePHP 도 유용 할 수 있습니다.


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


error_reporting(E_ALL | E_STRICT);

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


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




error-handling