PHP 디버깅 - PHP 코드 디버깅 방법(Drupal 디버깅 기술 포함!)

게시 됨: 2019-09-03

디버깅은 우리 개발자들이 기대하는 것이 아닙니다. 개발자는 버그를 싫어하지만 훌륭한 품질의 소프트웨어를 빌드하려면 디버깅은 개발자의 삶에서 없어서는 안될 부분입니다. 모든 PHP 개발자는 코드 디버깅을 위한 다른 스타일과 이동 방법을 가지고 있습니다. 이것은 그들의 경험, 문제 해결 방식, 그리고 가장 중요한 것은 그들이 가지고 있는 시간에 달려 있습니다!

디버깅이 얼마나 중요하며 코드를 디버깅해야 하는 이유는 무엇입니까?

디버깅은 품질 결과를 보장하는 소프트웨어 개발 수명 주기의 필수적인 부분입니다.
이것을 상상해보십시오 - 코드베이스가 크고 프로젝트가 처음이고 프로젝트/기능에 대한 세부 정보가 많지 않습니다. 하지만 버그를 수정해야 합니다. 우리는 어디에서 시작합니까? 코드를 단계별로 분석하여 수행된 작업과 문제가 발생한 부분을 이해하는 것으로 시작합니다. 내 친구, 디버깅입니다. 디버깅은 연습과 경험을 통해 향상될 수 있는 기술입니다.

PHP 코드를 디버그하는 방법

자, 여기 제가 개발 경력에서 만난 사례가 있습니다. Wordpress를 기반으로 구축된 상거래 사이트가 있는데 결제 프로세스가 5-8분 정도 걸리고 해결해 달라는 요청을 받았습니다. 이 경우 Wordpress에서 작동하는 방식에 대한 지식이 많지 않습니다. 그래서 다음과 같이 목록에서 옵션을 하나씩 확인하는 것으로 시작했습니다. (a) 일부 플러그인 때문인가요? (b) 주제와 관련이 있습니까? (c) 사용자 정의 코드 기반입니까? 등.

PHP 디버깅 및 이 경우를 해결하는 데 도움이 된 도구는 Blackfire입니다. 이렇게 하면 전체 프로세스에서 각 기능에 소요되는 시간인 모든 기능의 스택 추적에 대해 사용자가 더 읽기 쉬운 옵션을 제공합니다. 이것을 사용하여 결제 프로세스를 잡아먹는 기능을 찾았습니다. 코드 베이스에 키를 추가하기 위한 설정만 있으면 문서를 사용하여 모든 기능을 분석할 수 있습니다.
따라서 PHP 디버깅의 여러 방법에 대한 지식이 있으면 버그를 해결할 수 있습니다.

코드 디버깅 기술

PHP 디버깅에 사용한 몇 가지 기술에 대해 이야기하겠습니다.
작성한 함수 또는 메소드가 호출되는지 확인하는 가장 간단하고 일반적인 방법은 종료를 작성하는 것입니다. 이것을 사용하지 않은 개발자는 없을 것입니다!
일부 변수의 값을 확인하려면 print_r(), var_dump(), var_export(). 좋아, 차이점을 보자.

예시:

 배열을 가정 
$a = array( 1, array( "a", "b") );
print_r($a);

 
정렬
(
[ 0 ] => 1
[ 1 ] => 배열
(
[ 0 ] => '아'
[ 1 ] => 'ㄴ'
)
)

이것은 사람이 읽을 수 있는 형식과 변수에 대한 정보를 제공합니다. 또한 print_r($var, true)을 사용하여 변수에 저장할 수 있습니다.

 var_dump( $a );
 배열 ( 3 ) {
[ 0 ]=>
정수( 1 )
[ 1 ]=>
  배열 ( 2 ) {
[ 0 ]=>
문자열( 1 ) "아"
[ 1 ]=>
문자열( 1 ) "b"
}
}

이것은 각 값의 유형, 길이와 함께 인쇄됩니다. 그리고 이것은 print_r()에 비해 상대적으로 빠릅니다.
var_export( $a );

 배열 (
  0 => 1 ,
  1 =>
  배열 (
    0 => '아' ,
    1 => 'b' ,
),
)

이것은 각 값의 유형, 길이와 함께 인쇄됩니다. 그리고 이것은 print_r()에 비해 상대적으로 빠릅니다.
var_export( $a );

변수가 있으면 유효한 PHP를 반환하고 그렇지 않으면 false를 반환합니다. 즉, var_export의 출력을 php 파일에서 직접 사용할 수 있습니다.

Drupal core에서 제공하는 debug($var, NULL, TRUE)를 사용해 본 적이 있습니까? 이것은 PHP 디버그 함수에 전달된 인수를 기반으로 print_r() 또는 var_export를 사용합니다.

어떤 코드 라인이 그러한 경고를 일으키는지 알 수 없는 아래와 같은 경고는 어떻습니까?

경고: 485 행의 /modules/node/node.module에 있는 foreach()에 잘못된 인수가 제공되었습니다.

노드 모듈이 호출될 위치가 너무 많다는 것을 알고 있습니다. 어떻게 해결합니까? 다른 외부 리소스를 사용하지 않고 더 빠른 방법 중 하나는 PHP 함수 debug_backtrace() 를 사용하는 것 입니다. "drupal_set_message"로 이동합니다. 이것이 경고를 출력하는 방법이라는 것을 알고 있기 때문입니다. 해당 함수에 아래 줄을 넣으십시오.

debug_backtrace();

산출:

정렬
(
[ 0 ] => 배열
(
[파일] => /includes/common.inc
[줄] => 552
[ 기능 ] => drupal_set_message
[ 인수 ] => 배열
(
[ 0 ] => 경고: 유효하지 않음

foreach()에 제공된 인수

/modules/node/node.module 504 .
[ 1 ] => 오류
)

)

[1] => 배열
(
[파일] => /modules/node/node.module
[줄] => 504
[함수] => error_handler
[인수] => 배열
(
[ 0 ] => 2
[ 1 ] => 잘못된 인수
foreach()에 대해 제공됨
[ 2 ] => /모듈/노드/
노드 모듈
[ 3 ] => 504
[ 4 ] => 배열
(
[매개변수] =>
[개정] =>
[리셋] =>
...
)

)

)

[2] => 배열
(
[파일] => /sites/all/modules/custom/custom_module
/custom_module.module
[줄] => 10
[기능] => node_load
[인수] => 배열
(
[ 0 ] =>
)

)

[3] => 배열
(
[파일] => /includes/form.inc
[줄] => 365
[기능] => custom_module_form_alter
[인수] => 배열
(
...

이 함수는 경고를 발생시키는 과정에서 호출된 모든 함수의 스택을 보여줍니다. 제한을 제한해야 합니다. 그렇지 않으면 스택이 표시되는 데 너무 오래 걸리는 경우 PHP에서 "메모리 소진" 메시지를 표시합니다.

CLI를 통한 디버깅:

phpdbg에 대해 들어 보셨나요 ? 예, 명령줄에서 PHP 파일을 디버그하는 데 사용되는 PHP 5.6 이상에서 사용할 수 있는 PHP 확장이 있습니다.
터미널을 열고 "phpdbg"를 입력하십시오. 이것은 대화형 PHP 디버거 셸을 시작합니다. 중단점을 사용할 수도 있습니다! PHP를 디버깅하는 숨겨진 방법을 시도해보십시오.
유일한 문제는 phpdbg를 더 잘 사용하려면 phpdbg 명령에 익숙해져야 한다는 것입니다.

Drupal을 통한 디버깅:

Devel Kint: Drupal 개발자는 이것을 꽤 자주 사용합니다. Kint는 dump()와 함께 Drupal 8 나뭇가지 템플릿을 디버그하는 데 사용할 수 있는 Devel 모듈의 하위 모듈입니다.

DB 로그: 누가 이 Drupal 모듈을 모르나요?! D7에서는 watchdog() 이고 D8에서는 로거 서비스입니다.

\Drupal::logger( 'my_module' )->디버그($message);

그러나 우리가 이 모듈을 좋아함에도 불구하고 이 모듈의 사용을 권장하지 않는 유일한 이유는 로그 메시지가 매번 데이터베이스에 기록되기 때문입니다!

그리고 그것이 거대한 데이터베이스라면 더 나빠질 것이고 성능에 영향을 미칠 것이라고 상상해 보십시오. 그렇기 때문에 프로덕션 사이트에서는 DBLOG 모듈을 사용하지 않는 것이 좋습니다.
여전히 DBLog, 모듈을 사용하고 성능 영향을 줄이시겠습니까? 이에 대한 솔루션도 있습니다 - DBlog Filter. 이것은 데이터베이스에 기록될 로그 유형을 제한하는 데 도움이 되는 기여 모듈입니다. 예를 들어 심각도가 "오류"인 로그만 저장하려는 경우 이 모듈을 사용하여 구성할 수 있습니다. 따라서 Dblog 모듈을 완전히 제거할 필요는 없습니다. 아, 그리고 이 모듈은 제가 기여한 것입니다 ;)

웹 프로파일러

웹 프로파일러는 다시 Devel에서 제공하는 기여 모듈입니다. 모듈을 활성화하면 창 하단에 보고서가 표시됩니다. 페이지가 로드될 때마다 이 보고서는 페이지 로드 시간, 페이지에서 실행 중인 쿼리 수, 양식 수, 해당 페이지의 js/css 파일 수 등을 제공합니다.

웹 프로파일러

예, 각 섹션을 클릭하여 세부 정보를 제공합니다. 예를 들어 다음 이미지는 홈 페이지의 쿼리를 보여줍니다.

Xdebug

XDebug - IDE를 통한 디버깅:

대부분의 사람들이 코딩을 위해 IDE를 사용하는 경우 선호하는 가장 사용자 친화적인 디버깅 방법은 XDebug를 사용하는 것입니다. XDebug는 개발 및 디버깅을 지원하고 PHPStorm과 같은 IDE와 함께 사용할 수 있는 단일 단계 디버거를 제공하는 PHP 확장입니다. 물론 최상의 결과를 얻으려면 사용 중인 IDE로 확장을 설치하고 구성하는 데 더 많은 노력을 기울여야 합니다.