Kích hoạt chế độ gỡ lỗi
Hướng dẫn toàn diện về các tính năng và công cụ gỡ lỗi XOOPS.
Kiến trúc gỡ lỗi
Phần tiêu đề “Kiến trúc gỡ lỗi”graph TB subgraph "Debug Sources" A[PHP Errors] B[SQL Queries] C[Template Variables] D[Execution Time] E[Memory Usage] end
subgraph "Debug Output" F[On-Screen Display] G[Log Files] H[Debug Bar] I[Ray Debugger] end
A --> F A --> G B --> F B --> H C --> F D --> H E --> H
subgraph "Debug Levels" J[Level 0: Off] K[Level 1: PHP Only] L[Level 2: PHP + SQL] M[Level 3: Full Debug] endMức độ gỡ lỗi XOOPS
Phần tiêu đề “Mức độ gỡ lỗi XOOPS”Kích hoạt trong mainfile.php
Phần tiêu đề “Kích hoạt trong mainfile.php”<?php// Debug level settingsdefine('XOOPS_DEBUG_LEVEL', 2);
// Level 0: Debug off (production)// Level 1: PHP debug only// Level 2: PHP + SQL queries// Level 3: PHP + SQL + Smarty templatesChi tiết cấp độ
Phần tiêu đề “Chi tiết cấp độ”| Cấp độ | Lỗi PHP | Truy vấn SQL | Mẫu Vars | Được đề xuất cho |
|---|---|---|---|---|
| 0 | Ẩn | Không | Không | Sản xuất |
| 1 | Đã hiển thị | Không | Không | Kiểm tra nhanh |
| 2 | Đã hiển thị | Đã đăng nhập | Không | Phát triển |
| 3 | Đã hiển thị | Đã đăng nhập | Đã hiển thị | Gỡ lỗi sâu |
Hiển thị lỗi PHP
Phần tiêu đề “Hiển thị lỗi PHP”Cài đặt phát triển
Phần tiêu đề “Cài đặt phát triển”// Add to mainfile.php for developmenterror_reporting(E_ALL);ini_set('display_errors', '1');ini_set('display_startup_errors', '1');ini_set('log_errors', '1');ini_set('error_log', XOOPS_VAR_PATH . '/logs/php_errors.log');Cài đặt sản xuất
Phần tiêu đề “Cài đặt sản xuất”// Secure settings for productionerror_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);ini_set('display_errors', '0');ini_set('log_errors', '1');ini_set('error_log', XOOPS_VAR_PATH . '/logs/php_errors.log');Gỡ lỗi truy vấn SQL
Phần tiêu đề “Gỡ lỗi truy vấn SQL”Xem truy vấn ở chế độ gỡ lỗi
Phần tiêu đề “Xem truy vấn ở chế độ gỡ lỗi”Với XOOPS_DEBUG_LEVEL được đặt thành 2 hoặc 3, các truy vấn SQL sẽ xuất hiện ở cuối trang.
Ghi nhật ký truy vấn thủ công
Phần tiêu đề “Ghi nhật ký truy vấn thủ công”// Log specific query$sql = "SELECT * FROM " . $GLOBALS['xoopsDB']->prefix('mymodule_items');
// Before executingerror_log("SQL Query: " . $sql);
$result = $GLOBALS['xoopsDB']->query($sql);
// Log query time$start = microtime(true);$result = $GLOBALS['xoopsDB']->query($sql);$time = microtime(true) - $start;error_log("Query took: " . number_format($time * 1000, 2) . "ms");Sử dụng XoopsLogger
Phần tiêu đề “Sử dụng XoopsLogger”// Access the logger$logger = $GLOBALS['xoopsLogger'];
// Get all queries$queries = $logger->queries;foreach ($queries as $query) { echo "SQL: " . $query['sql'] . "\n"; echo "Time: " . $query['time'] . "s\n"; echo "---\n";}
// Log custom message$logger->addExtra('My Debug', 'Custom debug message');Gỡ lỗi mẫu Smarty
Phần tiêu đề “Gỡ lỗi mẫu Smarty”Kích hoạt Bảng điều khiển gỡ lỗi Smarty
Phần tiêu đề “Kích hoạt Bảng điều khiển gỡ lỗi Smarty”// In your module or template{debug}
// Or in PHP$GLOBALS['xoopsTpl']->debugging = true;$GLOBALS['xoopsTpl']->debugging_ctrl = 'URL'; // Add SMARTY_DEBUG to URLXem các biến được gán
Phần tiêu đề “Xem các biến được gán”{* In template, show all assigned variables *}<pre>{$smarty.template_object->tpl_vars|print_r}</pre>
{* Show specific variable *}{$myvar|@debug_print_var}Gỡ lỗi trong PHP
Phần tiêu đề “Gỡ lỗi trong PHP”// Before displaying templateecho "<pre>";print_r($GLOBALS['xoopsTpl']->getTemplateVars());echo "</pre>";Tích hợp trình gỡ lỗi Ray
Phần tiêu đề “Tích hợp trình gỡ lỗi Ray”Cài đặt
Phần tiêu đề “Cài đặt”composer require spatie/ray --devCấu hình
Phần tiêu đề “Cấu hình”// ray.php in XOOPS rootreturn [ 'enable' => true, 'host' => 'localhost', 'port' => 23517, 'remote_path' => null, 'local_path' => null,];Ví dụ sử dụng
Phần tiêu đề “Ví dụ sử dụng”// Basic outputray('Hello from XOOPS');
// Variable inspectionray($item)->label('Item Object');
// Expanded viewray($complexArray)->expand();
// Measure execution timeray()->measure();// ... code to measure ...ray()->measure();
// SQL queriesray()->showQueries();
// Color codingray('Error occurred')->red();ray('Success!')->green();ray('Warning')->orange();
// Stack traceray()->trace();
// Pause execution (like breakpoint)ray()->pause();Gỡ lỗi truy vấn cơ sở dữ liệu
Phần tiêu đề “Gỡ lỗi truy vấn cơ sở dữ liệu”// Log all queriesray()->showQueries();
// Or specific query$sql = "SELECT * FROM items WHERE status = 'active'";ray($sql)->label('Query');
$result = $db->query($sql);ray($result)->label('Result');Thanh gỡ lỗi PHP
Phần tiêu đề “Thanh gỡ lỗi PHP”Cài đặt
Phần tiêu đề “Cài đặt”composer require maximebf/debugbarTích hợp
Phần tiêu đề “Tích hợp”<?phpuse DebugBar\StandardDebugBar;
$debugbar = new StandardDebugBar();$debugbarRenderer = $debugbar->getJavascriptRenderer();
// Add to headerecho $debugbarRenderer->renderHead();
// Log messages$debugbar['messages']->addMessage('Hello World!');
// Log exceptions$debugbar['exceptions']->addException(new Exception('Test'));
// Time operations$debugbar['time']->startMeasure('operation', 'My Operation');// ... code ...$debugbar['time']->stopMeasure('operation');
// Add to footerecho $debugbarRenderer->render();Trình trợ giúp gỡ lỗi tùy chỉnh
Phần tiêu đề “Trình trợ giúp gỡ lỗi tùy chỉnh”<?phpnamespace XoopsModules\MyModule;
class Debug{ private static bool $enabled = true; private static array $logs = []; private static float $startTime;
public static function init(): void { self::$startTime = microtime(true); self::$enabled = (defined('XOOPS_DEBUG_LEVEL') && XOOPS_DEBUG_LEVEL > 0); }
public static function log(string $message, string $level = 'info'): void { if (!self::$enabled) return;
self::$logs[] = [ 'time' => microtime(true) - self::$startTime, 'level' => $level, 'message' => $message, 'memory' => memory_get_usage(true) ];
// Also write to file $logFile = XOOPS_VAR_PATH . '/logs/debug_' . date('Y-m-d') . '.log'; $logMessage = sprintf( "[%s] [%s] [%.4fs] [%s MB] %s\n", date('H:i:s'), strtoupper($level), microtime(true) - self::$startTime, round(memory_get_usage(true) / 1024 / 1024, 2), $message ); error_log($logMessage, 3, $logFile); }
public static function dump($var, string $label = ''): void { if (!self::$enabled) return;
$output = $label ? "$label: " : ''; $output .= print_r($var, true); self::log($output, 'dump');
if (php_sapi_name() !== 'cli') { echo "<pre style='background:#f5f5f5;padding:10px;margin:10px;border:1px solid #ddd;'>"; if ($label) echo "<strong>$label:</strong>\n"; var_dump($var); echo "</pre>"; } }
public static function time(string $label): callable { $start = microtime(true); return function() use ($start, $label) { $elapsed = microtime(true) - $start; self::log("$label: " . number_format($elapsed * 1000, 2) . "ms", 'timing'); }; }
public static function render(): string { if (!self::$enabled || empty(self::$logs)) return '';
$html = '<div style="background:#333;color:#fff;padding:20px;margin:20px;font-family:monospace;font-size:12px;">'; $html .= '<h3 style="margin-top:0;">Debug Log</h3>'; $html .= '<table style="width:100%;border-collapse:collapse;">';
foreach (self::$logs as $log) { $color = match($log['level']) { 'error' => '#ff6b6b', 'warning' => '#ffd93d', 'dump' => '#6bcb77', 'timing' => '#4d96ff', default => '#fff' };
$html .= sprintf( '<tr style="border-bottom:1px solid #555;"> <td style="padding:5px;width:80px;">%.4fs</td> <td style="padding:5px;width:80px;color:%s">%s</td> <td style="padding:5px;">%s</td> <td style="padding:5px;width:100px;">%s MB</td> </tr>', $log['time'], $color, strtoupper($log['level']), htmlspecialchars($log['message']), round($log['memory'] / 1024 / 1024, 2) ); }
$html .= '</table></div>'; return $html; }}
// UsageDebug::init();Debug::log('Page started');$timer = Debug::time('Database query');// ... query ...$timer();Debug::dump($result, 'Query Result');echo Debug::render();Luồng đầu ra gỡ lỗi
Phần tiêu đề “Luồng đầu ra gỡ lỗi”sequenceDiagram participant Code participant Debug participant Logger participant Output
Code->>Debug: Debug::log('message') Debug->>Logger: Write to log file Debug->>Debug: Store in memory
Code->>Debug: Debug::dump($var) Debug->>Output: Display formatted output
Code->>Debug: Debug::render() Debug->>Output: Display all logsTài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Màn hình trắng chết chóc
- Sử dụng trình gỡ lỗi Ray
- Thực tiễn tốt nhất về bảo mật
#xoops #gỡ lỗi #xử lý sự cố #phát triển #ghi nhật ký