댓글 검색 목록

[php] PHP 코드를 디버깅 하는 방법 – 팁과 간단한 기술

페이지 정보

작성자 운영자 작성일 20-04-19 18:30 조회 1,083 댓글 0

가장 잊을 수 없는 과정 


PHP 코드를 디버깅 하는 방법에 대한 튜토리얼에 오신 것을 환영합니다. 버그를 찾아서 없애는 것은 아마도 프로그래머에게 가장 끔찍한 부분 중 하나 일 것입니다. 특히 오류 메시지가 전혀 도움이 되지 않는 경우 – 의미가 맞지 않거나 정확한 오류의 위치를 ​​지적하지 않은 경우.


디버깅에는 다양한 도구와 특수 효과가 있지만 그중 어떤 것도 사용하지 않을 것입니다. 이 안내서는 "유니버설 디버깅 기술"에 대해 더 많이 다루므로 편집자 나 플랫폼에 관계없이 누구나 채택 할 수 있습니다. 그렇다면 PHP 코드를 어떻게 디버깅 합니까? 알아 보려면 계속 읽으십시오!


ⓘ이 튜토리얼을 시작할 때 모든 예제 소스 코드가 포함 된 zip 파일을 포함 시켰으므로 모든 내용을 복사하여 붙여 넣을 필요가 없습니다.


소스 코드 다운로드 


먼저 약속 된 예제 소스 코드에 대한 다운로드 링크가 있습니다.


소스 코드 다운로드 


모든 예제 소스 코드를 다운로드하려면 여기를 클릭하십시오. MIT 라이센스에 따라 릴리스 했으므로 코드 위에 빌드하거나 자신의 프로젝트에서 자유롭게 사용할 수 있습니다.


빠른 시작 


  • 폴더에 다운로드하여 압축을 풉니다.
  • 관련된 데이터베이스가 없으므로 포함 된 각 파일을 따라 가십시오.


기본 


디버깅 기술을 익히기 전에 알아야 할 몇 가지 기본 사항부터 시작하겠습니다. 이미 고급 코드 사용자인 경우 이 섹션을 건너 뛰십시오.


오류 메시지 활성화 및 비활성화 


그렇습니다. 우리는 실제로 PHP에서 오류 메시지를 비활성화 할 수 있으며, 초보자 중 일부는 왜 이러한“불완전한 것”을 비활성화 했는지 혼동 할 수 있습니다. 오류 메시지를 표시하는 것이 좋지 않습니까? 오류 메시지를 비활성화 하면 언제 오류가 발생했는지 어떻게 알 수 있습니까?


글쎄, 당신은 소프트웨어 개발의 세계를 조금 더 이해해야 합니다. 개발 측면에서는 원하는 모든 종류의 오류 메시지를 표시 할 수 있으며 개발자와 테스터가 이를 선택하는 것이 좋습니다.


그러나 실제 프로덕션 시스템과 관련하여 일부 사람들은 "우아한 시스템"에 대한 오류 메시지를 숨겨 사용자를 겁내지 않고 "조용히 조용히 충돌"하도록 선택합니다. 따라서, 실제로 알 필요가 없다면 프로덕션 시스템에서 오류 표시를 켜지 마십시오.


오류 설정 


이제 "오류가 발생했는지 어떻게 알 수 있습니까?"에 이어 php.ini 파일에는 6 가지 설정이 있습니다.


display_errors = On error_reporting = E_ALL display_startup_errors = On html_errors = On log_errors = On error_log = PATH/ERROR.LOG 


  • display_errors : 화면에 오류 메시지를 표시하십시오.
  • error_reporting : display_errors가 켜져 있는지 표시 할 오류 유형입니다. 아래에서 더 자세히 살펴 보겠습니다.
  • display_startup_error :  이것은 런타임 오류가 아닌 시작 오류를 표시합니다.
  • html_errors : 오류 메시지를 HTML 형식으로 포맷 하시겠습니까?
  • log_errors : 로그 파일에 오류를 유지하십시오.
  • error_log : 오류 로그 파일을 보관할 위치

따라서 일반적으로 :


  • 개발 서버에서“모든 오류 보고를 완전히 수행합니다”.
  • display_errors = Off로 숨기고 log_errors = 프로덕션 서버에서 – 이것이 오류 로그 파일에서 여전히 오류를 추적 할 수있는 방법입니다.


레벨보고 오류 


error_reporting으로 보고 수준을 설정할 수 있으며 일반적으로 3 가지 "기본 수준"이 있습니다.


  • E_ERROR Fatal errors.
  • E_WARNING Warnings, non-fatal errors.
  • E_NOTICE Notices, non-fatal.
  • E_ALL All kinds of errors.

위의 내용이 전부가 아니라는 것을 명심하십시오. 전체 목록은 공식 PHP 매뉴얼을 확인하십시오. 그러나 지금은 위와 같이 보고 수준을 조정할 수 있습니다.


; Report all errors error_reporting = E_ALL ; Report critical errors only error_reporting = E_ERROR ; Report critical errors and warnings error_reporting = E_ERROR | E_WARNING ; Report all errors, except notices error_reporting = E_ALL & ~E_NOTICE  


오류 유형 


컴퓨터에서 오류 보고를 활성화하면 PHP는 몇 가지 오류 메시지를 표시해야 합니다. 오류 메시지와 오류 해결 방법에 대한 힌트가 제공됩니다. 찾아야 할 일반적인 오류 유형은 다음과 같습니다.


FATAL ERRORS 


치명적 오류는 갑자기 스크립트를 중지하고 시스템을 중단 시킵니다. 치명적인 오류를 놓칠 수 있는 방법은 없습니다. 오류 보고가 꺼져 있어도 이상한 깨진 스크립트는 눈썹을 높이기 만합니다. 치명적 오류에는 일반적으로 정의되지 않은 함수 및 누락 된 파일이 포함됩니다.


<?php $foobar = doesnotexist(); require "doesnotexist.php"; ?> 


Fatal error: Uncaught Error: Call to undefined function doesnotexist() in D:\http\test\error-1-fatal.php:2 Stack trace: #0 {main} thrown in D:\http\test\error-1-fatal.php on line 2 


신택스 오류 


세미콜론이나 쉼표 누락과 같은 어리석은 것들.


<?php $foobar = "Doge Bork" $hello = "World"; ?> 


Parse error: syntax error, unexpected ‘$hello’ (T_VARIABLE) in D:\http\test\error-2-syntax.php on line 3 


WARNINGS 


경고는 중요하지 않은 오류이지만 여전히 중요합니다. 예를 들어, 대신 숫자가 필요한 함수에 문자열을 입력하면 시스템이 중단되지는 않지만 잘못된 결과가 발생할 수 있습니다.


<?php function addition ($x, $y) { return $x + $y; } echo addition(1, "x"); ?> 


Warning: A non-numeric value encountered in D:\http\test\error-3-warn.php on line 3 


NOTIFICATIONS 


가장 성가신 종류의 "오류"중 하나입니다. 알림은 종종 중요하지 않으며“이전에 정의하지 않았습니다”또는“더 이상 사용되지 않고 권장되지 않습니다”와 같은 내용을 상기 시키기 위해 여기에 있습니다.


<?php if ($_POST['foo']) { echo "YES!"; } ?> 


Notice: Undefined index: foo in D:\http\test\error-4-notify.php on line 2


SILENT ERRORS 


실제로 치명적인 오류가 있습니다. 오류 메시지를 표시하지 않고 발견하기가 어려우며 계속 실행됩니다. 스크립트가 원하는 종류의 결과를 생성하지 않을 때만 오류가 있음을 알게 됩니다. 예를 들어, 작은 오타 실수로 인해 "자동 오류"가 발생할 수 있습니다.


<?php function add ($x, $y) { // Original intention // return $x + $y; // Someone did a *small* typo mistake return $x - $y; } echo add(88, 22); // Should be 110, but result is 66 ?> 


디버깅 팁 및 기술 


이제 모든 기본 사항을 알았으므로 사용자 디버깅 팁과 기술 중 일부를 살펴 보겠습니다.


런타임 오류보고 


실제로 프로덕션 서버에서 오류를 표시해야 하고 특정 스크립트에 대해서만 – 예, 몇 줄의 ini_set 및 error_reporting으로 오류를 표시 할 수 있습니다.


<?php // All error reporting and logging on ini_set('display_startup_errors', 'On'); ini_set('display_errors', 'On'); ini_set('log_errors', 'On'); error_reporting(E_ALL); ?> 


오류 메시지의 스크린 샷을 얻은 후에 이 줄을 제거하십시오.


변수 덤프 


그렇다면 배열에는 무엇이 있습니까? 세션에서 문제를 일으키는 원인은 무엇입니까? print_r과 var_dump는 가장 친한 친구입니다.


<?php // Start session session_start(); // Simulation - we put something in the cart. $_SESSION['cart'] = [ "123" => [ "name" => "Foo bar", "qty" => 99 ], "234" => [ "name" => "Doge", "qty" => 88 ] ]; // What is in the session? print_r($_SESSION); // More details using var dump // var_dump($_SESSION); ?> 


코드 섹션 작성, 분할 및 정복. 


섹션에 코드를 작성해보십시오 – 이것은 디버깅 기술 일 뿐만 아니라 좋은 방법입니다. 자동 오류를 기억하십니까? 작은 오타 오류를 찾는 것은 코드의 바다에서 핀을 찾는 것과 정확히 같습니다.


그러나 코드를 섹션화 할 때 echo, print_r 또는 var_dump를 사용하여 코드의 각 섹션에서 값을 수동으로 확인하고 출력 할 수 있습니다. die() 또는 exit()와 함께 이를 사용하여 각 섹션에서 스크립트를 중지하십시오. 각 단계에서 출력이 올바른지 확인한 경우에만 다음 섹션으로 천천히 이동하십시오.


<?php // (1) INIT $varA = ["Hello", "World", "Foo", "Bar"]; $varB = ""; // (2) CONCAT foreach ($varA as $txt) { $varB .= $txt; } // We can halt after a section and see if scripts are working properly echo $varB; die(); // Will stop here // (3) MORE PROCESSING $varA[] = "Doge"; $varB .= "Last"; // (4) OUTPUT print_r($varA); echo $varB; ?> 


좋은 편집자 또는 IDE 사용 


php-debug-highlight.jpg 


이것은 기술이 아니라 상식적인 것입니다. 좋은 코드 편집기를 사용하면 입력 할 때 모든 오류가 강조 표시되고 코드 형식을 지정할 수 있습니다. 세미콜론 누락과 같은 바보 같은 실수를 모두 걸러냅니다.


CUSTOM ERROR LOG 


이전부터 log_errors 및 error_log 파일에“백그라운드”오류를 기록 할 수 있다는 것을 기억하십니까? 실제로 PHP에서 error_log() 함수를 사용하여 수동으로 오류 항목을 만들 수 있습니다. 예를 들어, 다른 서버에 연결하는 스크립트가 있으며 연결에 실패하면 오류 항목을 기록합니다.


<?php $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://DOES-NOT-EXIST.com/dummy.php", CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false ]); $result = curl_exec($curl); if ($result === false) { // ERROR LOG error_log("Failed connecting to https://DOES-NOT-EXIST.com", 0); } else { // OK } curl_close($curl); ?> 


특정 사항이나 특정 서비스의 안정성을 모니터링 하려는 경우 매우 유용합니다. 그런데 error_log ()로 알림 이메일을 보낼 수도 있습니다. 더 많은 옵션은 공식 PHP 매뉴얼을 확인하십시오.


GRACEFUL FAILURES


PHP에서 오류가 발생해도 끝이 아닙니다. 이것은 대부분의 기본 자습서에 있지만 빠른 요약 – try-catch-finally 블록을 사용하면 예외를 정상적으로 처리 할 수 ​​있습니다.


<?php // TRY TO DO SOMETHING try { $pdo = new PDO( "mysql:host=localhost;charset=utf8", "user", "password", [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } // ERROR - DO SOMETHING HERE // THROW ERROR MESSAGE OR ALTERNATIVE catch (Exception $ex) { print_r($ex); } ?> 


SUPPRESSING ERROR MESSAGES


마지막으로 이것은 디버깅과 관련이 없지만 함수 앞에 @를 추가하여 오류 메시지를 억제 할 수 있습니다. 예를 들어 존재하지 않는 파일을 열 때 :


<?php $file = @fopen("does-not-exist.txt", "r"); @fclose($file); ?> 


유용한 비트 


이 안내서의 전부입니다. 다음은 유용한 추가 정보에 대한 작은 섹션입니다.


링크 및 참조 


INFOGRAPHIC 


php-errors-small.jpg 



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.