PHP 스크립트를 디버깅하려면 어떻게 해야 합니까?
PHP 스크립트를 디버깅하려면 어떻게 해야 합니까?
에러 리포트 사용 등 기본적인 디버깅에 대해 알고 있습니다.PHPEclipse의 브레이크 포인트 디버깅도 매우 편리합니다.
phpStorm 또는 다른 IDE에서 디버깅하는 가장 좋은 방법은 무엇입니까?
Eclipse PDT를 사용하여 디버깅 기능이 있는 Eclipse 환경을 설정하십시오.코드를 디버깅하는 기능은 var_dump의 기존 방식보다 훨씬 좋은 방법입니다.또, 플로우가 어디에서 잘못되고 있는지를 다양한 포인트로 인쇄합니다.다른 모든 것이 실패해도 SSH와 vim밖에 없습니다.var_dump()
/die()
코드가 어디로 흘러가는지 알아내야 해
Firephp 추가 기능을 사용하여 javascript와 동일한 환경에서 php를 디버깅할 수 있습니다.
또한 앞에서 언급한 Xdebug를 사용하여 php를 프로파일링합니다.
다음은 저의 작은 디버깅 환경입니다.
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;
}
}
}
Xdebug 및 DBGP 플러그인은 고부하 버그 사냥용 메모장++, FirePHP는 경량입니다.빠르고 지저분하다고?dBug보다 나은 것은 없다.
XDebug는 개발에 필수적입니다.다른 확장자보다 먼저 설치합니다.에러에 대한 스택트레이스를 얻을 수 있어 프로파일링을 용이하게 할 수 있습니다.
데이터 구조를 간단히 보려면 을 참조하십시오.사용하지 않다print_r()
그 에 it it it를 붙여야 하기 때문이다.<pre>
한 번에 하나의 바만 출력합니다.
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
실제 디버깅 환경에서는 Komodo IDE가 가장 좋지만 가격은 $$입니다.
PhpEd 정말 좋아요.기능을 시작/오버/종료할 수 있습니다.애드혹 코드를 실행하고 변수를 검사하고 변수를 변경할 수 있습니다.놀라워.
1) print_r()를 사용합니다.TextMate에는 다음과 같이 확장되는 'pre'의 스니펫이 있습니다.
echo "<pre>";
print_r();
echo "</pre>";
2) Xdebug를 사용하지만 Mac에서 GUI가 제대로 작동하지 않습니다.적어도 스택 트레이스의 판독 가능한 버전을 출력합니다.
Zend Studio(5.5)와 Zend Platform을 함께 사용해 왔습니다.이를 통해 적절한 디버깅, 중단점/코드에 대한 스텝오버 등이 제공되지만 가격은 저렴합니다.
솔직히 print와 print_r()의 조합으로 변수를 출력합니다.많은 사람들이 다른 고급 방법을 사용하는 것을 선호한다는 것을 알지만, 저는 이것이 가장 사용하기 쉽다고 생각합니다.
저는 Uni에서 마이크로프로세서 프로그래밍을 하고 이마저도 사용할 수 없게 되기 전까지는 이 사실을 제대로 이해하지 못했다고 말할 것입니다.
Derick Rethans의 Xdebug는 매우 좋다.얼마 전에 사용해 봤는데 설치가 쉽지 않았어요.이 작업을 완료하면 이 기능을 사용하지 않고 어떻게 작업을 수행했는지 이해할 수 없습니다.-)
Zend Developer Zone(Linux에 설치하는 것은 쉬운 일이 아닌 것 같다)과 Firefox 플러그인에 대한 좋은 기사가 있습니다.
XDebug와 함께 Netbeans를 사용합니다.설정 방법에 대한 문서는 웹사이트에서 확인하십시오.http://php.netbeans.org/
XDebug 및 Easy XDebug FireFox 애드온과 함께 Netbeans를 사용합니다.
MVC 프로젝트를 디버깅할 때 애드온은 필수적입니다.이는 Netbeans에서 XDebug가 실행되는 일반적인 방법은 URL을 통해 dbug 세션을 등록하는 것이기 때문입니다.FireFox에 애드온을 설치하면 Netbeans 프로젝트 속성 -> [설정 실행] -> [상세설정]를 설정하고 [웹 브라우저를 열지 않음]를 선택합니다.이것으로 브레이크 포인트를 설정하고, 통상대로 Ctrl+F5 를 사용해 디버깅 세션을 개시할 수 있습니다.FireFox를 열고 오른쪽 하단 모서리에 있는 추가 기능 아이콘을 마우스 오른쪽 버튼으로 클릭하여 중단점 모니터링을 시작합니다.코드가 브레이크 포인트에 도달하면 정지하고 변수 상태와 콜스택을 검사할 수 있습니다.
출력 버퍼링은 출력을 망치지 않으려면 매우 유용합니다.자유롭게 코멘트/비평할 수 있는 원라이너로 이 작업을 수행합니다.
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
PhpEdit에는 디버거가 내장되어 있습니다만, 저는 보통 echo(); print_r(); 구식 방식을 사용합니다.
print_r/echo를 사용하여 IDE(PhpEd) 디버깅 기능을 사용하고 있기 때문에 시간이 너무 많이 걸리는 중대한 문제에 대해서는,지금까지 사용한 다른 IDE와 달리 PhpEd는 셋업이 거의 필요 없습니다.문제가 생겼을 때 사용하지 않는 유일한 이유는 고통스러울 정도로 느리기 때문입니다.속도가 PhpEd 또는 php 디버거에 고유한지 잘 모르겠습니다.PhpEd는 무료는 아니지만 오픈 소스 디버거 중 하나(앞에서 언급한 XDebug와 같은)를 사용하는 것 같습니다.PhpEd의 장점은 셋업이 필요없다는 것입니다.이것 역시 과거에 매우 지루하다고 느꼈습니다.
으로 수동 . - 수동 디버깅이 더 빠릅니다.var_dump()
★★★★★★★★★★★★★★★★★」debug_print_backtrace()
논리를 강화하는 데 필요한 모든 도구입니다.
음, 어느 정도는 일이 어디로 흘러가느냐에 따라 다르죠.이것이 첫 번째로 분리하려고 하는 것입니다.그 후 필요에 따라 echo/print_r()을 사용합니다.
nB: true를 print_r()의 두 번째 인수로 전달하면 출력 대신 출력이 반환된다는 것을 알고 계십니까? 예:
echo "<pre>".print_r($var, true)."</pre>";
는 케이크를 자주 합니다.Rails PHP.를 디버깅 , , 「」, 「」, 「」, 「」를해 주세요.error.log
.tmp mp폴 、 tmp 、 in in in in in in
tail -f app/tmp/logs/error.log
이 기능을 사용하면, 케이크의 다이얼로그를 실행할 수 있어 매우 편리합니다.미드 코드로 출력하고 싶은 경우는, 사용할 수 있습니다.
$this->log('xxxx');
이것은 보통 무슨 일이 일어나고 있는지/잘못하고 있는지를 잘 알 수 있습니다.
print_r( debug_backtrace();
뭐 그런 거 :-)
Komodo IDE는 xdebug와 함께 동작합니다.리모어 디버깅에도 적합합니다.최소한의 구성이 필요합니다.필요한 것은 Komodo가 로컬에서 사용할 수 있는 php 버전뿐입니다.스크립트를 komodo 프로젝트로 Import 했을 경우는, 마우스 클릭으로 중단점을 설정할 수 있습니다.이클립스를 사용하여 Java 프로그램을 디버깅할 수 있습니다.리모트 디버깅은 MAC 또는 Linux 데스크톱에 있는 경우 설정하기 쉬운 로컬 디버깅 설정보다 확실히 더 까다롭습니다(작업 공간에서 리모트 URL을 php 스크립트로 매핑해야 할 수도 있습니다).
Nusphere는 php nusphere에도 좋은 디버거입니다.
코딩 시 수없이 많은 시간을 절약할 수 있는 PHP 디버깅 기술이 있습니다.효과적이지만 기본적인 디버깅 방법은 단순히 오류 보고서를 켜는 것입니다.조금 더 진보된 또 다른 기술은 인쇄문을 사용하는 것입니다.이 기술은 실제로 화면에 표시되는 내용을 표시함으로써 더 이해하기 어려운 버그를 찾아내는 데 도움이 됩니다.PHPeclipse는 일반적인 구문 오류를 강조 표시할 수 있는 이클립스 플러그인이며 디버거와 함께 사용하여 중단점을 설정할 수 있습니다.
display_errors = Off
error_reporting = E_ALL
display_errors = On
또한 사용됨
error_log();
console_log();
실제 가동 환경에서는 error_log()를 사용하여 서버의 오류 로그에 관련 데이터를 기록합니다.
내장 디버거로 일식을 위해 zend studio를 사용합니다.xdebug를 사용한 이클립스 pdt를 사용한 디버깅에 비해 아직 느립니다.이러한 문제를 해결할 수 있기를 바랍니다. 최근 출시보다 속도가 향상되었지만, 여전히 문제를 극복하는 데는 2-3초가 걸립니다.zend Firefox 툴바를 사용하면 작업을 쉽게 디버깅할 수 있습니다(다음 페이지, 현재 페이지 등).또한 코드를 벤치마킹하여 파이 차트, 실행 시간 등을 제공하는 프로파일러도 제공합니다.
수 .var_dump
주요 변수 중 일부를 입력하지만 개발 중인 애플리케이션의 종류에 따라 달라질 수 있습니다.
보다 복잡한 알고리즘에서는 스텝/브레이크 포인트/워치 기능이 매우 도움이 됩니다(필요하지 않은 경우).
PHP DBG
SAPI 모듈로 구현된 Interactive Stepthrough PHP Debugger로 코드 기능이나 성능에 영향을 주지 않고 환경을 완벽하게 제어할 수 있습니다.가볍고 강력하며 사용하기 쉬운 PHP 5.4+용 디버깅 플랫폼을 목표로 하며, PHP 5.6과 함께 즉시 배송됩니다.
특징은 다음과 같습니다.
- 스텝스루 디버깅
- 유연한 중단점(클래스 메서드, 함수, 파일:회선, 주소, 운용코드)
- 내장된 eval()을 사용하여 PHP에 쉽게 액세스
- 현재 실행 중인 코드에 쉽게 접근
- 유저랜드 API
- SAPI에 구애받지 않음 - 쉽게 통합 가능
- PHP 구성 파일 지원
- JIT Super Globals - 나만의 것을 만들어라!!
- 옵션 리드라인 지원 - 쾌적한 터미널 조작
- 리모트 디버깅서포트 - 번들 Java GUI
- 간단한 조작
스크린샷 참조:
홈페이지 : http://phpdbg.com/
PHP 오류 - PHP 오류 보고 기능 향상
이것은 라이브러리(실제로 파일)를 사용하여 PHP 스크립트를 디버깅하기 매우 쉽습니다.
필요한 것은 다음과 같이 1개의 파일(코드의 선두에)을 포함시키는 것뿐입니다.
require('php_error.php');
\php_error\reportErrors();
그러면 모든 오류가 역추적, 코드 컨텍스트, 함수 인수, 서버 변수 등의 정보를 제공합니다.예를 들어 다음과 같습니다.
특징은 다음과 같습니다.
- 사용법이 간단해, 1개의 파일에 지나지 않는다.
- 일반 요청 및 Ajaxy 요청에 대해 브라우저에 표시되는 오류
- AJAX 요청이 일시 중지되어 자동으로 다시 실행할 수 있습니다.
- 에러를 가능한 한 엄격하게 합니다(코드 품질을 낮추고 퍼포먼스를 향상시키는 경향이 있습니다).
- 스택 트레이스 전체에 걸친 코드 스니펫
- 에 상세 정보(전체 기능 시그니처 등)를 나타냅니다.
- 일부 오류 메시지를 수정하는 데 이는 완전히 잘못된 것입니다.
- 구문 강조 표시
- 예쁘다!
- 커스터마이즈
- 수동으로 켜고 끄다
- 오류 보고 없이 특정 섹션 실행
- 파일을 무시하면 스택트레이스에서 코드가 강조 표시되지 않습니다.
- 응용 프로그램 파일. 오류가 발생했을 때 우선순위가 지정됩니다.
홈페이지 : http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
마이포크(추가 수정 포함): https://github.com/kenorb-contrib/PHP-Error
DTrace
시스템이 DTrace 동적 트레이스(OS X에 기본 설치)를 지원하며 PHP가 DTrace 프로브를 활성화하여 컴파일된 경우(--enable-dtrace
디폴트로는 이 명령어를 사용하면 시간 없이 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 는 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/(또는 편리한 포트를 선택하십시오) 사이트에 액세스할 수 있습니다.여기서부터 몇 개의 페이지에 액세스 하고, 트레이스 출력을 표시합니다.
주의: 디폴트로는 OS X에서 Dtrace를 사용할 수 있습니다.Linux에서는 dtrace4linux가 필요할 수 있습니다.또는 다른 대체품을 확인해 주세요.
시스템 탭
SystemTap 패키지 "SystemTap SDT")를하십시오.yum install systemtap-sdt-devel
를 참조해 주세요.
은 스크립트입니다.all_probes.stp
Tap을 PHP는 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.net에서 PHP DTrace 정적 프로브와 함께 SystemTap 사용
print_r의 경우 +1이 명령을 사용하여 개체 또는 변수의 내용을 덤프합니다.읽기 쉽게 하려면 소스를 볼 필요가 없도록 사전 태그를 사용하여 수행합니다.
echo '<pre>';
print_r($arrayOrObject);
또한 var_dump($thing) - 하위 항목 유형을 확인하는 데 매우 유용합니다.
문제에 따라 error_reporting(E_ALL)과 에코 테스트(초기적으로 오류가 발생한 행/파일을 찾기 위해, 항상 행/파일 php가 알려주는 것은 아닙니다), IDE 브레이스 매칭("Parse error: 구문 오류, 예기치 않은 $end" 문제 해결을 위해), print_r() 프로그램 종료(실제 vdump)의 조합을 사용합니다.iew 소스;p)
또한 "memory_get_usage();" 및 "memory_get_peak_usage();"를 사용하여 phpdebug(sourceforge 체크)를 눌러 문제 영역을 찾을 수도 없습니다.
코드를 거치면서 변수의 값을 확인할 수 있는 통합 디버거는 정말 멋집니다.단, 서버상의 소프트웨어 셋업과 클라이언트상의 일정량의 설정이 필요합니다.둘 다 정상 작동 상태를 유지하기 위해 정기적인 유지보수가 필요합니다.
print_r은 쓰기 쉽고 어떤 셋업에서도 동작할 수 있습니다.
보통 파일에 저장하고 디버깅 정보를 저장하며 최종적으로 공통 바닥글에 다시 인쇄할 수 있는 커스텀 로그 기능을 만듭니다.
또한 이러한 유형의 디버깅이 반자동화되도록 공통 예외 클래스를 재정의할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/888/how-do-you-debug-php-scripts
'programing' 카테고리의 다른 글
PHP cURL vs file_get_contents (0) | 2022.11.23 |
---|---|
Java를 사용하여 JSONArray 항목 구성원 액세스 (0) | 2022.11.23 |
사용자의 mysql 서버에 원격 액세스 권한을 부여하는 방법 (0) | 2022.11.23 |
MySQL Enum의 성능 이점 (0) | 2022.11.23 |
Ubuntu 14.04에 PHP intl 확장을 설치하는 방법 (0) | 2022.11.23 |