PHP에서 유용한 오류 메시지를 얻는 방법은 무엇입니까?
PHP로 프로그래밍하는 것이 상당히 실망 스럽습니다. 나는 종종 스크립트를 실행하고 빈 화면을 다시 보게됩니다. 빈 화면으로 오류 메시지가 없습니다. 원인은 단순한 구문 오류 (잘못된 대괄호, 세미콜론 누락) 또는 함수 호출 실패 또는 기타 다른 것일 수 있습니다.
무엇이 잘못되었는지 알아내는 것은 매우 어렵습니다. 코드를 주석 처리하고, 어디서나 "echo"문장을 입력하는 등 문제를 좁히려 고합니다. 그러나 더 좋은 방법이 있어야합니다.
그렇다면 Java와 마찬가지로 PHP가 유용한 오류 메시지를 생성하는 방법이 있습니까? 누구나 좋은 PHP 디버깅 팁과 기술을 추천 할 수 있습니까?
구문 오류의 경우 php.ini에서 오류 표시를 활성화해야합니다. 오류 메시지가 표시되는 "고객"을 원하지 않기 때문에 기본적으로이 기능은 해제되어 있습니다. 이 페이지를 확인 2 개 지침에 대한 자세한 내용은 PHP 문서에서 : error_reporting
와 display_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);
다음 링크도 참조하십시오
- http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors
- http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
- http://php.net/manual/en/function.error-reporting.php
디버깅하려는 파일에 다음 줄을 포함시킬 수 있습니다.
error_reporting(E_ALL);
ini_set('display_errors', '1');
이것은 php.ini의 기본 설정보다 우선합니다. PHP는 오류를 로그에보고합니다.
PHP 설정
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 파일을 변경할 수 없으므로 해당 옵션을 사용할 수 없습니다. 그러나 두려워하지 마십시오! 우리는 다른 옵션이 있습니다 !
런타임 구성
원하는 스크립트에서 런타임에 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.ini
PHP에서 오류를 기록하여 구문 및 시작 오류를 포착한다는 것입니다.
여기에 설명 된 설정은 어떤 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 를 권장합니다 .
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_reporting
에 E_ALL | E_STRICT
php.ini 파일에.
error_reporting = E_ALL | E_STRICT
E_STRICT
더 이상 사용되지 않는 기능에 대해 알리고 특정 작업을 수행하는 가장 좋은 방법에 대한 권장 사항을 제공합니다.
통지를 원하지 않지만 다른 메시지 유형이 도움이되는 경우 통지를 제외하십시오.
error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE
또한 display_errors
php.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 라이브러리에 대한 특별한 언급을하고 싶습니다.
하기 위해 ...
- 항상 데이터베이스 관련 오류를보고
- 무언가 잘못되었는지 확인하기 위해 메소드의 리턴 유형을 확인하지 마십시오
가장 좋은 옵션은 예외를 발생 시키도록 라이브러리를 구성하는 것 입니다.
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);
이 답변은 리던던시 부서에서 제공합니다.
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
-
error_display가 비활성화 된 경우 마지막 런타임 알림 / 경고 / 오류를 검색하는 데 사용할 수 있습니다.
-
수퍼 로컬 변수이며 마지막 PHP 런타임 메시지도 포함합니다.
isset()
가라!나는이 사람들을 많이 불쾌 알고 있지만,
isset
그리고empty
해야 하지 이민자에 의해 사용. 코드가 작동하는지 확인한 후 알림 억제를 추가 할 수 있습니다 . 그러나 결코 전에는.최근에 발생하는 많은 "뭔가 작동하지 않는"질문은 다음과 같은 오타의 결과입니다.
if(isset($_POST['sumbit'])) # ↑↑
코드에
isset
/empty
/ 가 포함되어 있으면 유용한 알림이 표시되지 않습니다array_keys_exists
. 때때로 사용하는 것이@
더 합리적 이므로 통지 및 경고는 최소한 로그에 전달됩니다.assert_options(ASSERT_ACTIVE|ASSERT_WARNING);
assert()
섹션에 대한 경고를받습니다 . (매우 드물지만 더 유능한 코드에는 일부가 포함될 수 있습니다.)PHP7은
zend.assertions=1
php.ini 에서도 필요합니다 .-
엄격하게 타입이 지정된 언어로 PHP를 구부리는 것은 많은 논리 오류를 수정하지는 않지만 디버깅 목적의 옵션입니다.
PDO / MySQLi
@Phil은 이미 PDO / MySQLi 오류보고 옵션에 대해 언급했습니다 . 물론 다른 데이터베이스 API에도 비슷한 옵션이 있습니다.
json_last_error()
+json_last_error_msg
JSON 파싱
-
정규식의 경우.
-
curl 요청을 디버그하려면 최소한 CURLOPT_VERBOSE가 필요합니다.
-
마찬가지로 쉘 명령 실행은 자체적으로 오류를 생성하지 않습니다. 당신은 항상
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¶m=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
'IT story' 카테고리의 다른 글
추상 클래스를 인스턴스화 할 수 있습니까? (0) | 2020.02.09 |
---|---|
BehaviorSubject와 Observable? (0) | 2020.02.09 |
Git을 사용할 때“오류 : 잘못된 색인 – 치명적 : 색인 파일 손상”을 해결하는 방법 (0) | 2020.02.09 |
Eclipse / Java 코드 완료가 작동하지 않습니다 (0) | 2020.02.09 |
NS 접두사는 무엇을 의미합니까? (0) | 2020.02.09 |