PHP 스크립트를 어떻게 디버깅 합니까?
오류보고 사용과 같은 기본 디버깅을 알고 있습니다. PHPEclipse 의 중단 점 디버깅 도 매우 유용합니다.
phpStorm 또는 다른 IDE에서 디버깅 하는 가장 빠르고 쉬운 방법은 무엇입니까?
PHP 스크립트를 어떻게 디버깅 합니까?
오류보고 사용과 같은 기본 디버깅을 알고 있습니다. PHPEclipse 의 중단 점 디버깅 도 매우 유용합니다.
phpStorm 또는 다른 IDE에서 디버깅 하는 가장 빠르고 쉬운 방법은 무엇입니까?
답변:
언급 한 디버깅 기능이있는 Eclipse 환경을 설정하려면 Eclipse PDT 를 사용해보십시오 . 코드로 들어가는 기능은 이전의 var_dump 메소드를 디버깅하고 다양한 지점에서 인쇄하여 흐름이 잘못되는 위치를 확인하는 훨씬 좋은 방법입니다. 모든 사람은 비록 실패하고 내가 가진 모든 SSH 내가 여전히 정력 때 var_dump()
/ die()
코드가 남쪽 어디로 찾을 수 있습니다.
kill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
이것은 내 작은 디버그 환경입니다.
error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');
function assert_callcack($file, $line, $message) {
throw new Customizable_Exception($message, null, $file, $line);
}
function error_handler($errno, $error, $file, $line, $vars) {
if ($errno === 0 || ($errno & error_reporting()) === 0) {
return;
}
throw new Customizable_Exception($error, $errno, $file, $line);
}
function exception_handler(Exception $e) {
// Do what ever!
echo '<pre>', print_r($e, true), '</pre>';
exit;
}
function shutdown_handler() {
try {
if (null !== $error = error_get_last()) {
throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
}
} catch (Exception $e) {
exception_handler($e);
}
}
class Customizable_Exception extends Exception {
public function __construct($message = null, $code = null, $file = null, $line = null) {
if ($code === null) {
parent::__construct($message);
} else {
parent::__construct($message, $code);
}
if ($file !== null) {
$this->file = $file;
}
if ($line !== null) {
$this->line = $line;
}
}
}
assert_callcack
heh
XDebug 는 개발에 필수적입니다. 다른 확장 프로그램보다 먼저 설치합니다. 모든 오류에 대한 스택 추적을 제공하며 프로파일 링을 쉽게 활성화 할 수 있습니다.
데이터 구조를 간단히 살펴 보려면 사용하십시오 var_dump()
. print_r()
당신은 그것을 둘러싸 야하고 <pre>
한 번에 하나의 var 만 인쇄 하기 때문에 사용하지 마십시오 .
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
실제 디버깅 환경에서 내가 찾은 최고는 Komodo IDE 이지만 $$입니다.
PhpEd는 정말 좋습니다. 기능을 시작 / 종료 / 종료 할 수 있습니다. 임시 코드를 실행하고 변수를 검사하고 변수를 변경할 수 있습니다. 놀랍습니다.
1) print_r ()을 사용합니다. TextMate에는 다음과 같이 확장되는 'pre'에 대한 스 니펫이 있습니다.
echo "<pre>";
print_r();
echo "</pre>";
2) Xdebug를 사용하지만 Mac에서 GUI가 제대로 작동하지 못했습니다. 최소한 읽기 가능한 버전의 스택 추적을 인쇄합니다.
echo '<pre>', print_r($var, true), '</pre>';
내가 사용했습니다 젠드 스튜디오 (5.5) 과 함께, 젠드 플랫폼 . 적절한 디버깅, 중단 점 / 코드 스테핑 등을 제공하지만 가격은 비쌉니다.
정직하게, 변수를 인쇄하기 위해 print와 print_r ()의 조합. 많은 사람들이 다른 고급 방법을 선호하지만 이것이 가장 사용하기 쉬운 방법이라는 것을 알고 있습니다.
Uni에서 마이크로 프로세서 프로그래밍을하고이 기능을 사용할 수 없을 때까지 이것을 완전히 이해하지 못했다고 말할 것입니다.
Derick Rethans의 Xdebug 는 매우 좋습니다. 얼마 전에 사용했는데 설치가 쉽지 않은 것으로 나타났습니다. 당신이 완료되면, 당신은 그것없이 관리 방법을 이해하지 못할 것입니다 :-)
Zend Developer Zone 에 대한 좋은 기사 (Linux에 설치하는 것이 더 쉬운 것처럼 보이지는 않습니다)와 Firefox 플러그인 도 있습니다.
XDebug와 함께 Netbeans를 사용합니다. 구성 방법에 대한 문서는 웹 사이트에서 확인하십시오. http://php.netbeans.org/
XDebug 및 Easy XDebug FireFox 애드온 과 함께 Netbeans를 사용 합니다.
Netbeans에서 XDebug가 실행되는 일반적인 방법은 URL을 통해 dbug 세션을 등록하는 것이므로 MVC 프로젝트를 디버깅 할 때 애드온이 필수적입니다. FireFox에 애드온을 설치하면 Netbeans 프로젝트 속성-> 구성 실행-> 고급을 설정하고 "웹 브라우저를 열지 마십시오"를 선택하십시오. 이제 평소와 같이 중단 점을 설정하고 Ctrl-F5를 사용하여 디버깅 세션을 시작할 수 있습니다 . FireFox를 열고 오른쪽 하단 모서리에있는 애드온 아이콘을 마우스 오른쪽 단추로 클릭하여 중단 점 모니터링을 시작하십시오. 코드가 중단 점에 도달하면 중지되고 변수 상태 및 콜 스택을 검사 할 수 있습니다.
출력 버퍼링은 출력을 엉망으로 만들고 싶지 않은 경우 매우 유용합니다. 나는 1 개의 라이너로 이것을 수행하고 자유롭게 의견을 말하거나 주석을 풀 수 있습니다.
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
print_r / echo를 사용하여 IDE의 (PhpEd) 디버깅 기능을 사용하는 데 너무 많은 시간이 걸리는 매우 거친 문제의 경우. 필자가 사용한 다른 IDE와 달리 PhpEd는 설정이 거의 필요하지 않습니다. 내가 직면 한 문제에 대해 사용하지 않는 유일한 이유는 고통스럽게 느리기 때문입니다. 속도가 PhpEd 또는 PHP 디버거와 관련이 있는지 확실하지 않습니다. PhpEd는 무료가 아니지만 어쨌든 오픈 소스 디버거 중 하나 (예 : XDebug와 같은)를 사용한다고 생각합니다. PhpEd의 장점은 과거에 실제로 매우 지루한 설정이 필요 없다는 것입니다.
print_r (debug_backtrace ());
또는 그런 것 :-)
Komodo IDE는 remore 디버깅에도 xdebug와 잘 작동합니다. 최소한의 구성이 필요합니다. Komodo가 로컬에서 사용하여 중단 점에서 코드를 단계별로 실행할 수있는 PHP 버전 만 있으면됩니다. komodo 프로젝트로 스크립트를 가져온 경우 마우스 클릭으로 중단 점을 설정하여 Java 프로그램 디버깅을 위해 이클립스에서 설정 한 방식으로 중단 점을 설정할 수 있습니다. 원격 디버깅은 MAC 또는 Linux 데스크톱에있는 경우 구성하기 쉬운 로컬 디버깅 설정보다 올바르게 작동하기 위해 분명히 까다 롭습니다 (작업 공간에서 PHP 스크립트로 원격 URL을 매핑해야 할 수도 있음). .
코딩 할 때 수많은 시간을 절약 할 수있는 많은 PHP 디버깅 기술이 있습니다. 효과적이지만 기본적인 디버깅 기술은 단순히 오류보고를 설정하는 것입니다. 약간 더 발전된 또 다른 기술은 print 문을 사용하는 것인데, 실제로는 화면에 실제로 진행되고있는 것을 표시하여 더 어려운 버그를 찾아 낼 수 있습니다. PHPeclipse는 일반적인 구문 오류를 강조 표시하고 디버거와 함께 사용하여 중단 점을 설정할 수있는 Eclipse 플러그인입니다.
display_errors = Off
error_reporting = E_ALL
display_errors = On
또한 사용
error_log();
console_log();
내장 디버거와 함께 일식에 zend studio를 사용합니다. xdebug를 사용하는 이클립스 pdt로 디버깅하는 것에 비해 여전히 느립니다. 그들이 이러한 문제를 해결하기를 바라며, 최근 릴리즈에서는 속도가 향상되었지만 여전히 스테핑은 2-3 초가 걸립니다. zend firefox 툴바는 실제로 작업을 쉽게 해줍니다 (다음 페이지, 현재 페이지 등). 또한 코드를 벤치마킹하고 파이 차트, 실행 시간 등을 제공하는 프로파일 러를 제공합니다.
대화식 Stepthrough PHP 디버거는 SAPI 모듈로 구현되어 코드의 기능이나 성능에 영향을주지 않고 환경을 완벽하게 제어 할 수 있습니다. PHP 5.4+를위한 가볍고 강력하며 사용하기 쉬운 디버깅 플랫폼을 목표로하며 PHP 5.6과 함께 기본 제공됩니다.
특징은 다음과 같습니다.
스크린 샷을 참조하십시오 :
홈페이지 : http://phpdbg.com/
라이브러리 (실제 파일)를 사용하여 PHP 스크립트를 디버깅하는 것은 매우 쉽습니다.
당신이해야 할 유일한 것은 아래와 같이 하나의 파일을 포함시키는 것입니다 (코드의 시작 부분에) :
require('php_error.php');
\php_error\reportErrors();
그런 다음 모든 오류는 역 추적, 코드 컨텍스트, 함수 인수, 서버 변수 등과 같은 정보를 제공합니다. 예를 들면 다음과 같습니다.
특징은 다음과 같습니다.
홈페이지 : http://phperror.net/
GitHub : https://github.com/JosephLenton/PHP-Error
내 포크 (추가 수정 사항 포함) : https://github.com/kenorb-contrib/PHP-Error
시스템이 DTrace 동적 추적 (OS X에 기본적으로 설치됨)을 지원 하고 기본적으로 --enable-dtrace
사용해야 하는 DTrace 프로브 ( )를 사용하여 PHP를 컴파일하는 경우이 명령을 사용하면 시간없이 PHP 스크립트를 디버깅 할 수 있습니다.
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
그래서 당신에 추가 된 다음과 같은 별칭을 부여 RC의 파일 (예를 들어 ~/.bashrc
, ~/.bash_aliases
) :
alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'
기억하기 쉬운 별칭으로 스크립트를 추적 할 수 있습니다 trace-php
.
다음은 고급 dtrace 스크립트입니다.에 저장 dtruss-php.d
하고 실행 가능하게 만들고 ( chmod +x dtruss-php.d
) 실행하십시오.
#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d
#pragma D option quiet
php*:::compile-file-entry
{
printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}
php*:::compile-file-return
{
printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}
php*:::error
{
printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::exception-caught
{
printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::exception-thrown
{
printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::execute-entry
{
printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::execute-return
{
printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::function-entry
{
printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::function-return
{
printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::request-shutdown
{
printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
php*:::request-startup
{
printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
홈페이지 : GitHub의 dtruss-lamp
간단한 사용법은 다음과 같습니다.
sudo dtruss-php.d
.php -r "phpinfo();"
..이를 테스트하려면 다음을 통해 모든 docroot로 이동하여 index.php
PHP 내장 서버를 실행할 수 있습니다 .
php -S localhost:8080
그 후 http : // localhost : 8080 / 사이트에 액세스 할 수 있습니다 하거나 편리한 포트를 선택할 수 있습니다. 거기에서 추적 출력을 보려면 일부 페이지에 액세스하십시오.
참고 : Dtrace는 기본적으로 OS X에서 사용할 수 있으며 Linux에서는 dtrace4linux 가 필요 하거나 다른 대안이 있는지 확인하십시오 .
참조 : PHP와 DTrace를 사용 php.net에서
또는 SystemTap SDT 개발 패키지 (예 :)를 설치하여 SystemTap 추적을 확인하십시오 yum install systemtap-sdt-devel
.
다음은 all_probes.stp
SystemTap으로 PHP 스크립트를 실행하는 동안 모든 핵심 PHP 정적 프로브 포인트를 추적하는 예제 스크립트 ( )입니다.
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
printf("Probe compile__file__entry\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
printf("Probe compile__file__return\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
printf("Probe error\n");
printf(" errormsg %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
printf("Probe exception__caught\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
printf("Probe exception__thrown\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
printf("Probe execute__entry\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
printf("Probe execute__return\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
printf("Probe function__entry\n");
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
printf("Probe function__return: %s\n", user_string($arg1));
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
printf("Probe request__shutdown\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
printf("Probe request__startup\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
용법:
stap -c 'sapi/cli/php test.php' all_probes.stp
참조 : PHP DTrace를 정적 프로브와 SystemTap의 사용 php.net에서
print_r ()의 경우 +1 이를 사용하여 객체 또는 변수의 내용을 덤프하십시오. 가독성을 높이려면 사전 태그를 사용하여 소스를 볼 필요가 없도록하십시오.
echo '<pre>';
print_r($arrayOrObject);
또한 var_dump ($ thing)-하위 유형을 보는 데 매우 유용합니다
문제에 따라 error_reporting (E_ALL)과 echo 테스트의 조합을 좋아합니다 (오류가 발생한 행 / 파일을 찾기 위해 오류가 처음 발생했습니다. 행 / 파일 PHP가 항상 올바른 것은 아니라는 것을 알고 있습니다), IDE 중괄호 일치 ( "파싱 오류 : 구문 오류, 예기치 않은 $ end"문제 해결) 및 print_r (); 출구; 덤프 (실제 프로그래머는 소스를 본다; p).
또한 "memory_get_usage ();"를 사용하여 phpdebug (check sourceforge)를 이길 수 없습니다. "memory_get_peak_usage ();" 문제 영역을 찾을 수 있습니다.