>백엔드 개발 >PHP 튜토리얼 >PHP 프로그램을 디버깅하는 다양한 방법 소개_php 기술

PHP 프로그램을 디버깅하는 다양한 방법 소개_php 기술

WBOY
WBOY원래의
2016-05-16 20:32:391010검색

디버깅의 정의: 프로그램이 제대로 작동할 수 있도록 특정 방법을 사용하여 프로그램의 결함 수를 찾아 줄이고 줄입니다.
다음은 PHP 프로그램을 디버깅하는 방법에 대한 몇 가지 경험입니다.

1. PHP 자체 디버깅 기능

1. 오류 보고 기능 내장

두 명사: 개발 환경은 개발자가 개발하고 디버깅하는 환경이고, 프로덕션 환경은 최종 고객이 사용하는 온라인 환경입니다.
개발 환경과 프로덕션 환경에서는 오류 보고 기능을 별도로 설정해야 합니다.

(1) 개발 환경

개발 환경에서 오류 보고를 활성화해야 합니다. 다음은 php.ini의 구성 항목과 설명입니다.

코드 복사 코드는 다음과 같습니다.

; 이 지시문은 오류 보고 수준을 설정합니다.
; 개발 값: E_ALL | E_STRICT (코딩 표준을 포함한 모든 오류, 경고 및 알림을 표시합니다.)
error_reporting = E_ALL | E_STRICT

이 지시문은 PHP가 오류를 출력할지 여부와 위치를 제어합니다.
; 알림 및 경고도 개발 중에 매우 유용합니다.
; 개발 가치: On
display_errors = 켜짐

이렇게 하면 개발 과정에서 최대한 빨리 오류를 발견할 수 있습니다.

낮은 수준의 오류인 "주의 사항: 정의되지 않은 변수: a in E:phpspacetest.php on line 14"이더라도 정의되지 않은 변수를 사용하면 버그가 숨겨지는 경우가 많습니다.

오픈 소스 클래스 라이브러리를 도입했는데 낮은 수준의 오류가 많이 발생하면 어떻게 될까요? 일반적으로 코드 품질이 좋은 클래스 라이브러리는 "알림" 수준 오류를 보고하지 않습니다. 따라서 이는 클래스 라이브러리의 품질을 식별하는 방법이기도 합니다.

(2) 제작환경

프로덕션 환경에서는 오류를 직접 출력할 수 없으며 로그에 기록합니다. php.ini의 구성 항목과 설명은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

; 프로덕션 환경에서는 매우 위험할 수 있습니다.
;
보다는 프로덕션 서버에 오류를 기록하는 것이 좋습니다. ; STDOUT으로 오류가 전송되었습니다.
display_errors = 꺼짐

; 오류를 표시하는 것 외에도 PHP는
과 같은 위치에 오류를 기록할 수도 있습니다. ; 서버별 로그, STDERR 또는 error_log에 의해 지정된 위치
; 아래에 있는 지시어는 프로덕션에 표시되어서는 안 됩니다.
; 서버는 여전히 모니터링되어야 하며 로깅은 이를 수행하는 좋은 방법입니다.
; 생산 가치: 켜짐
log_errors = 켜짐

; 지정된 파일에 오류를 기록합니다.
error_log = /path/to/php_error.log

물론, 로그를 파일에 쓰는 것은 선택 사항일 뿐이며, 다른 구성도 있으니 매뉴얼을 참고하세요.

프로덕션 환경에서는 중단점, 인쇄 등을 수행할 수 없으므로 로그가 좋은 선택입니다.

2. 기타 언어 기능의 사용

(1) 오류 제어 연산자 "@"를 덜 자주 사용하세요

이 기능은 PHP 표현식 앞에 "@"을 배치하는 것이며 표현식으로 인해 생성될 수 있는 모든 오류 메시지는 무시됩니다.

이 표현식에 결함이 발생하면 PHP 출력에 오류가 표시되지 않으므로 디버깅이 더 어려워집니다. 그러니 가능하다면 사용하지 마세요.

(2) 일부 기능에는 자체 디버그 기능이 있습니다

예를 들어 다음 코드 줄은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

$fp = fsockopen(“www.example.com”, 80, $errno, $errstr, 30);

개발자는 디버깅 중에 $fp가 비어 있고 연결이 실패함을 확인했습니다. 이 줄에 문제가 있는데 연결이 실패하는 이유는 무엇입니까?

이 함수는 PHP와 함께 제공되며 심층적으로 디버깅할 수 없습니다. 따라서 일반적으로 이러한 기능(주로 네트워크 통신 유형)은 자체 디버깅 매개변수인 $errno 및 $errstr을 제공합니다. 다음을 추가할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

if (!$fp) echo “$errstr ($errno)
n”;

연결이 실패한 이유를 확인할 수 있습니다.

이러한 함수는 fsockopen, pfsockopen, stream_socket_server, stream_socket_client 등입니다.

mysql_errno,socket_last_error,socket_strerror 등과 같이 함수를 디버깅하는 데 사용되는 일부 함수도 있습니다.

이를 이해하고 마주칠 때마다 활용하면 됩니다.

2. 디버깅 도구 소개

복잡한 문제가 발생하면 디버깅 도구를 사용할 수 있습니다. 보다 성숙한 것에는 Xdebug와 ZendDebugger가 포함됩니다.

Xdebug를 예로 들면 인쇄 출력 스타일 및 배열 수준 제어, 스택 오류 추적, 함수 호출 추적, 코드 실행 범위 분석, 프로그램 프로파일링 및 원격 디버깅이 가능합니다. 자세한 내용은 http://xdebug.org/docs/를 참조하세요.

Xdebug의 처음 두 가지 기능은 PHP의 원래 디버깅 기능을 개선하여 디버깅을 더욱 편리하게 만들어줍니다.

디버깅할 수 없는 복잡한 문제는 비즈니스 문제일 수 있습니다. 비즈니스 로직 디버깅에 대해서도 아래에서 설명합니다.

3. 비즈니스 로직 오류 디버깅

PHP 스크립트가 오류 없이 실행되면 문법 오류가 없다고 말할 수 있을 뿐 비즈니스 로직에 오류가 없다는 의미는 아닙니다.

많은 비즈니스 로직 오류는 구문 오류에 반영되지 않지만 디버깅 아이디어는 PHP에 포함된 디버깅 기능과 유사합니다.

몇 가지 방법을 소개합니다.

1.가장 기본적인 디버깅 방법

먼저 두 가지를 결정합니다. 프로그램의 예상 결과와 기대에 미치지 못하는 프로그램의 현재 결과입니다.
두 결과와 관련된 코드 조각을 찾으세요.
이 코드 조각을 읽고 "육안으로" 오류를 찾아보세요.
찾을 수 없으면 일부 주요 변수를 출력하고 해당 값이 올바른지 확인하여 오류가 발생한 위치를 확인해야 합니다.
여러 번 시도한 후에는 결국 오류가 발생한 지점을 확인할 수 있습니다.

Xdebug와 같은 도구를 사용하여 변수 값의 변경 사항을 보거나 디버깅을 위한 중단점을 설정할 수도 있습니다.

2. 녹화작업 로그

일부 복잡하거나 특수한 비즈니스의 경우 위의 방법이 적합하지 않습니다. 예를 들어 중단할 수 없는 백그라운드 실행 스크립트가 있습니다. 이러한 경우에는 실행 로그를 기록하는 것이 더 적절합니다.

로그에 보관할 항목을 선택하세요. 비즈니스에서 더 중요한 항목 외에도 일반적으로 네트워크 연결 및 통신, 시스템 권한 문제 등 오류가 발생할 가능성이 있는 영역이 있습니다.

3. 단위 테스트

첫번째 포인트처럼 디버깅 후 테스트 코드를 버리지 말고 코드로 테스트해보세요. 테스트 중심 개발.

이 주제는 비교적 크지만 여기서 언급하는 것이 적절합니다. 관심 있는 학생들은 더 많은 것을 배울 수 있습니다.

4. 비기능 오류 디버깅

프로그램 중단을 일으키는 메모리 오버플로, 프로그램 속도 저하를 일으키는 효율성 문제, 무한 루프 등과 같은 비기능적 오류.

이러한 문제의 경우 "육안"으로 코드를 확인하는 것은 너무 비효율적입니다.

그러므로 디버깅 도구를 사용하여 프로그램 프로파일링을 수행하고 프로그램의 병목 현상을 확인할 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.