서버 쪽에서 복잡한 과정을 거쳐 작업이 이루어 지거나
(DB를 호출하는 로직등등)
또는, 여러가지 오류검사나 정합성 검증이 필요한 경우에는
대부분 별도로 오류 처리하는 함수를 두게 된다.
그런데 이 함수를 호출하는 곳이 여러 군데 라면
어떤 값을 거쳐서 이 오류상황에 도달하게 되었는지가 프로그램을 고치는데,
또는 상황을 파악해서 문제를 해결하는데 중요한 정보가 된다.
이런 경우 var_dump와 debug_backtrace 또는 debug_print_backtrace함수를 적절히 활용하면
훌륭한 디버깅 환경을 갖출 수 있다.
다음은 그 샘플 코드로 backtrace()는 php.net에 올라와 있는 코드이고
ana_failmail은 backtrace()를 활용하여 오류가 발생한 경우 담당자에게
메일을 발송하도록 한것이다.
($failmail_sender, $failmail_receiver만 미리 설정해 두면된다)
function backtrace()
{
$output = "<div style=''''text-align: left;''''>\n";
$output .= "<b>Backtrace:</b><br />\n";
$backtrace = debug_backtrace();
foreach ($backtrace as $bt) {
$args = '''''''';
foreach ($bt[''''args''''] as $a) {
if (!empty($args)) {
$args .= '''', '''';
}
switch (gettype($a)) {
case ''''integer'''':
case ''''double'''':
$args .= $a;
break;
case ''''string'''':
$a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? ''''...'''' : '''''''');
$args .= "\"$a\"";
break;
case ''''array'''':
$args .= ''''Array(''''.count($a).'''')'''';
break;
case ''''object'''':
$args .= ''''Object(''''.get_class($a).'''')'''';
break;
case ''''resource'''':
$args .= ''''Resource(''''.strstr($a, ''''#'''').'''')'''';
break;
case ''''boolean'''':
$args .= $a ? ''''True'''' : ''''False'''';
break;
case ''''NULL'''':
$args .= ''''Null'''';
break;
default:
$args .= ''''Unknown'''';
}
}
$output .= "<br />\n";
$output .= "<b>file:</b> {$bt[''''line'''']} - {$bt[''''file'''']}<br />\n";
$output .= "<b>call:</b> {$bt[''''class'''']}{$bt[''''type'''']}{$bt[''''function'''']}($args)<br />\n";
}
$output .= "</div>\n";
return $output;
}
function ana_failmail($msg)
{
global $PHP_SELF, $failmail_sender, $failmail_receiver;
$title = "process fail($PHP_SELF)";
echo "$msg<br>\n";
ini_set("SMTP","메일서버 이름이나 주소를입력"); // 메일 서버가 설정되어 있다면 필요 없음
$mheader="MIME-Version: 1.0\r\nContent-type: text/html;\r\nFrom: $failmail_sender\r\n";
if (mail($failmail_receiver, $title, $msg."<br>\n".backtrace(), $mheader))
echo "메일 전송 성공";
else
echo "메일 전송 실패";
}
(DB를 호출하는 로직등등)
또는, 여러가지 오류검사나 정합성 검증이 필요한 경우에는
대부분 별도로 오류 처리하는 함수를 두게 된다.
그런데 이 함수를 호출하는 곳이 여러 군데 라면
어떤 값을 거쳐서 이 오류상황에 도달하게 되었는지가 프로그램을 고치는데,
또는 상황을 파악해서 문제를 해결하는데 중요한 정보가 된다.
이런 경우 var_dump와 debug_backtrace 또는 debug_print_backtrace함수를 적절히 활용하면
훌륭한 디버깅 환경을 갖출 수 있다.
다음은 그 샘플 코드로 backtrace()는 php.net에 올라와 있는 코드이고
ana_failmail은 backtrace()를 활용하여 오류가 발생한 경우 담당자에게
메일을 발송하도록 한것이다.
($failmail_sender, $failmail_receiver만 미리 설정해 두면된다)
function backtrace()
{
$output = "<div style=''''text-align: left;''''>\n";
$output .= "<b>Backtrace:</b><br />\n";
$backtrace = debug_backtrace();
foreach ($backtrace as $bt) {
$args = '''''''';
foreach ($bt[''''args''''] as $a) {
if (!empty($args)) {
$args .= '''', '''';
}
switch (gettype($a)) {
case ''''integer'''':
case ''''double'''':
$args .= $a;
break;
case ''''string'''':
$a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? ''''...'''' : '''''''');
$args .= "\"$a\"";
break;
case ''''array'''':
$args .= ''''Array(''''.count($a).'''')'''';
break;
case ''''object'''':
$args .= ''''Object(''''.get_class($a).'''')'''';
break;
case ''''resource'''':
$args .= ''''Resource(''''.strstr($a, ''''#'''').'''')'''';
break;
case ''''boolean'''':
$args .= $a ? ''''True'''' : ''''False'''';
break;
case ''''NULL'''':
$args .= ''''Null'''';
break;
default:
$args .= ''''Unknown'''';
}
}
$output .= "<br />\n";
$output .= "<b>file:</b> {$bt[''''line'''']} - {$bt[''''file'''']}<br />\n";
$output .= "<b>call:</b> {$bt[''''class'''']}{$bt[''''type'''']}{$bt[''''function'''']}($args)<br />\n";
}
$output .= "</div>\n";
return $output;
}
function ana_failmail($msg)
{
global $PHP_SELF, $failmail_sender, $failmail_receiver;
$title = "process fail($PHP_SELF)";
echo "$msg<br>\n";
ini_set("SMTP","메일서버 이름이나 주소를입력"); // 메일 서버가 설정되어 있다면 필요 없음
$mheader="MIME-Version: 1.0\r\nContent-type: text/html;\r\nFrom: $failmail_sender\r\n";
if (mail($failmail_receiver, $title, $msg."<br>\n".backtrace(), $mheader))
echo "메일 전송 성공";
else
echo "메일 전송 실패";
}