Only record the same error or query once

PHP 8.2로 올라오면서 동일한 오류가 수백~수천 번 반복되어
디버그 데이터가 너무 많은 메모리를 차지하는 문제가 종종 발생하고 있음.

동일한 위치에서 발생한 동일한 오류나 쿼리는 한 번만 기록하고
count를 증가시키도록 하여, 불필요한 메모리 사용을 줄이고
반복되는 오류나 쿼리를 쉽게 찾을 수 있도록 개선함.
This commit is contained in:
Kijin Sung 2023-04-30 23:56:54 +09:00
parent 968bde2c38
commit a1bd9cc2bc
3 changed files with 97 additions and 19 deletions

View file

@ -51,11 +51,18 @@ Debug Entries
$entry->message = trim(preg_replace('/\r?\n/', "\n" . ' ', print_r($entry->message, true)));
}
echo sprintf('%02d. %s', ++$entry_count, $entry->message) . "\n";
$is_first_entry = true;
foreach ($entry->backtrace as $key => $backtrace)
{
if (isset($backtrace['file']) && isset($backtrace['line']))
{
echo sprintf(' - %s line %d', $backtrace['file'], $backtrace['line']) . "\n";
echo sprintf(' - %s line %d', $backtrace['file'], $backtrace['line']);
if ($is_first_entry)
{
echo ' (×' . $entry->count . ')';
$is_first_entry = false;
}
echo "\n";
}
}
}
@ -74,11 +81,18 @@ PHP Errors and Warnings
foreach ($data->errors as $error)
{
echo sprintf('%02d. %s: %s', ++$error_count, $error->type, $error->message) . "\n";
$is_first_error = true;
foreach ($error->backtrace as $key => $backtrace)
{
if (isset($backtrace['file']) && isset($backtrace['line']))
{
echo sprintf(' - %s line %d', $backtrace['file'], $backtrace['line']) . "\n";
echo sprintf(' - %s line %d', $backtrace['file'], $backtrace['line']);
if ($is_first_error)
{
echo ' (×' . $error->count . ')';
$is_first_error = false;
}
echo "\n";
}
}
}
@ -101,7 +115,7 @@ Database Queries
echo sprintf('%02d. %s', ++$query_count, $query->query_string) . "\n";
if (empty($query->backtrace))
{
echo sprintf(' - Caller: %s', $query_caller) . "\n";
echo sprintf(' - Caller: %s', $query_caller) . ' (×' . $query->count . ')' . "\n";
}
echo sprintf(' - Connection: %s', $query->query_connection) . "\n";
echo sprintf(' - Query ID: %s', $query->query_id) . "\n";
@ -109,7 +123,7 @@ Database Queries
echo sprintf(' - Result: %s', $query_result) . "\n";
if (!empty($query->backtrace))
{
echo sprintf(' - Call Stack: %s', $query_caller) . "\n";
echo sprintf(' - Call Stack: %s', $query_caller) . ' (×' . $query->count . ')' . "\n";
foreach ($query->backtrace ?? [] as $key => $backtrace)
{
if (isset($backtrace['file']) && isset($backtrace['line']))