Sử dụng trình gỡ lỗi Ray
Sử dụng Trình gỡ lỗi Ray cho XOOPS
Phần tiêu đề “Sử dụng Trình gỡ lỗi Ray cho XOOPS”Gỡ lỗi hiện đại với Ray: kiểm tra các biến, thông báo nhật ký, theo dõi các truy vấn SQL và hiệu suất hồ sơ trong ứng dụng XOOPS của bạn.
Ray là gì?
Phần tiêu đề “Ray là gì?”Ray là một công cụ gỡ lỗi nhẹ giúp bạn kiểm tra trạng thái ứng dụng mà không cần dừng thực thi hoặc sử dụng các điểm ngắt. Nó hoàn hảo cho sự phát triển XOOPS.
Tính năng:
- Thông điệp tường trình và các biến
- Kiểm tra các truy vấn SQL
- Theo dõi hiệu suất
- Mã hồ sơ
- Nhật ký liên quan đến nhóm
- Dòng thời gian trực quan
Yêu cầu:
- PHP 7.4+
- Ứng dụng Ray (có sẵn phiên bản miễn phí)
- Nhà soạn nhạc
Cài đặt
Phần tiêu đề “Cài đặt”Bước 1: Cài đặt gói Ray
Phần tiêu đề “Bước 1: Cài đặt gói Ray”cd /path/to/xoops
# Install Ray via Composercomposer require spatie/ray
# Or install globallycomposer global require spatie/rayBước 2: Tải ứng dụng Ray
Phần tiêu đề “Bước 2: Tải ứng dụng Ray”Tải xuống từ ray.so:
- Mac: Ray.app
- Windows: Ray.exe
- Linux: tia (AppImage)
Bước 3: Cấu hình Tường lửa (nếu cần)
Phần tiêu đề “Bước 3: Cấu hình Tường lửa (nếu cần)”Ray sử dụng cổng 23517 theo mặc định:
# UFWsudo ufw allow 23517/udp
# iptablessudo iptables -A INPUT -p udp --dport 23517 -j ACCEPTCách sử dụng cơ bản
Phần tiêu đề “Cách sử dụng cơ bản”Ghi nhật ký đơn giản
Phần tiêu đề “Ghi nhật ký đơn giản”<?phprequire_once 'mainfile.php';require 'vendor/autoload.php';
// Initialize Ray$ray = ray();
// Log a simple message$ray->info('Page loaded');
// Log a variable$user = ['name' => 'John', 'email' => 'john@example.com'];$ray->dump($user);
// Log with label$ray->label('User Data')->dump($user);?>Đầu ra trong ứng dụng Ray:
ℹ Page loaded👁 User Data: ['name' => 'John', 'email' => 'john@example.com']Các cấp độ nhật ký khác nhau
Phần tiêu đề “Các cấp độ nhật ký khác nhau”<?php$ray = ray();
// Info$ray->info('Informational message');
// Success$ray->success('Operation completed');
// Warning$ray->warning('Potential issue');
// Error$ray->error('An error occurred');
// Debug$ray->debug('Debug information');
// Notice$ray->notice('Notice message');?>Bán phá giá các biến
Phần tiêu đề “Bán phá giá các biến”<?php$ray = ray();
// Simple dump$ray->dump($variable);
// Multiple dumps$ray->dump($var1, $var2, $var3);
// With labels$ray->label('User')->dump($user);$ray->label('Post')->dump($post);
// Dump array with formatting$config = [ 'debug' => true, 'cache' => 'redis', 'db_host' => 'localhost'];$ray->label('Configuration')->dump($config);?>Tính năng nâng cao
Phần tiêu đề “Tính năng nâng cao”1. Theo dõi truy vấn SQL
Phần tiêu đề “1. Theo dõi truy vấn SQL”<?php$ray = ray();
// Log database query$ray->notice('Running query');$result = $GLOBALS['xoopsDB']->query("SELECT * FROM xoops_users LIMIT 10");
// Log resultwhile ($row = $result->fetch_assoc()) { $ray->dump($row);}
// Or log with label$query = "SELECT COUNT(*) as total FROM xoops_articles";$ray->label('Article Count Query')->info($query);$result = $GLOBALS['xoopsDB']->query($query);?>2. Hồ sơ hiệu suất
Phần tiêu đề “2. Hồ sơ hiệu suất”<?php$ray = ray();
// Start a profile$ray->showQueries(); // Show all queries
// Your code$start = microtime(true);expensive_operation();$end = microtime(true);
$ray->label('Execution Time')->info(($end - $start) . ' seconds');
// Or measure directly$ray->measure(function() { expensive_operation();});?>3. Gỡ lỗi có điều kiện
Phần tiêu đề “3. Gỡ lỗi có điều kiện”<?php$ray = ray();
// Only in developmentif (defined('XOOPS_DEBUG_LEVEL') && XOOPS_DEBUG_LEVEL > 0) { $ray->debug('Debug mode enabled');}
// Only for specific userif ($xoopsUser && $xoopsUser->getVar('uid') == 1) { $ray->dump($sensitive_data);}
// Only in specific sectionif ($_GET['debug'] == 'module') { $ray->label('Module Debug')->dump($_GET);}?>4. Nhóm các nhật ký liên quan
Phần tiêu đề “4. Nhóm các nhật ký liên quan”<?php$ray = ray();
// Start a group$ray->group('User Authentication'); $ray->info('Checking credentials'); $ray->info('Password verified'); $ray->success('User authenticated');$ray->groupEnd();
// Or use closure$ray->group('Database Operations', function($ray) { $ray->info('Connecting to database'); $ray->info('Running queries'); $ray->success('Operations complete');});?>Gỡ lỗi dành riêng cho XOOPS
Phần tiêu đề “Gỡ lỗi dành riêng cho XOOPS”Gỡ lỗi mô-đun
Phần tiêu đề “Gỡ lỗi mô-đun”<?phprequire_once '../../mainfile.php';require_once XOOPS_ROOT_PATH . '/vendor/autoload.php';
$ray = ray();
// Log module initialization$ray->group('Module Initialization'); $ray->info('Module: ' . XOOPS_MODULE_NAME);
// Check module is active if (is_object($xoopsModule)) { $ray->success('Module loaded'); $ray->dump($xoopsModule->getValues()); }
// Check user permissions if (xoops_isUser()) { $ray->info('User: ' . $xoopsUser->getVar('uname')); } else { $ray->warning('Anonymous user'); }$ray->groupEnd();
// Get module config$config_handler = xoops_getHandler('config');$module = xoops_getHandler('module')->getByDirname(XOOPS_MODULE_NAME);$settings = $config_handler->getConfigsByCat(0, $module->mid());
$ray->label('Module Settings')->dump($settings);?>Gỡ lỗi mẫu
Phần tiêu đề “Gỡ lỗi mẫu”<?php// In template or PHP code$ray = ray();
// Log assigned variables$tpl = new XoopsTpl();$ray->label('Template Variables')->dump($tpl->get_template_vars());
// Log specific variables$ray->label('User Variable')->dump($tpl->get_template_vars('user'));
// Log Smarty engine state$ray->label('Smarty Config')->dump([ 'compile_dir' => $tpl->getCompileDir(), 'cache_dir' => $tpl->getCacheDir(), 'debugging' => $tpl->debugging]);?>Gỡ lỗi cơ sở dữ liệu
Phần tiêu đề “Gỡ lỗi cơ sở dữ liệu”<?php$ray = ray();
// Log database operations$ray->group('Database Operations');
// Count queries$ray->info('Database Prefix: ' . XOOPS_DB_PREFIX);
// List tables$result = $GLOBALS['xoopsDB']->query("SHOW TABLES");$tables = [];while ($row = $result->fetch_row()) { $tables[] = $row[0];}$ray->label('Tables')->dump($tables);
// Check connectionif ($GLOBALS['xoopsDB']) { $ray->success('Database connected');} else { $ray->error('Database connection failed');}
$ray->groupEnd();?>Chức năng tia tùy chỉnh
Phần tiêu đề “Chức năng tia tùy chỉnh”Tạo hàm trợ giúp
Phần tiêu đề “Tạo hàm trợ giúp”<?phpclass RayHelper { public static function init() { return ray(); }
public static function module($module_name) { $ray = ray(); $module = xoops_getHandler('module')->getByDirname($module_name);
if (!$module) { $ray->error("Module '$module_name' not found"); return; }
$ray->group("Module: $module_name"); $ray->dump([ 'name' => $module->getVar('name'), 'version' => $module->getVar('version'), 'active' => $module->getVar('isactive'), 'mid' => $module->getVar('mid') ]); $ray->groupEnd(); }
public static function user() { global $xoopsUser; $ray = ray();
if (!$xoopsUser) { $ray->info('Anonymous user'); return; }
$ray->group('User Information'); $ray->dump([ 'uname' => $xoopsUser->getVar('uname'), 'uid' => $xoopsUser->getVar('uid'), 'email' => $xoopsUser->getVar('email'), 'admin' => $xoopsUser->isAdmin() ]); $ray->groupEnd(); }
public static function config($module_name) { $ray = ray();
$module = xoops_getHandler('module')->getByDirname($module_name); if (!$module) { $ray->error("Module '$module_name' not found"); return; }
$config_handler = xoops_getHandler('config'); $settings = $config_handler->getConfigsByCat(0, $module->mid());
$ray->label("$module_name Configuration")->dump($settings); }}?>Cách sử dụng:
<?phprequire 'class/rayhelper.php';
RayHelper::user();RayHelper::module('mymodule');RayHelper::config('mymodule');?>Giám sát hiệu suất
Phần tiêu đề “Giám sát hiệu suất”Hiệu suất truy vấn
Phần tiêu đề “Hiệu suất truy vấn”<?php$ray = ray();
// Measure query time$ray->group('Query Performance');
$queries = [ "SELECT COUNT(*) FROM xoops_users", "SELECT * FROM xoops_articles LIMIT 1000", "SELECT a.*, u.uname FROM xoops_articles a JOIN xoops_users u"];
foreach ($queries as $query) { $start = microtime(true); $result = $GLOBALS['xoopsDB']->query($query); $time = (microtime(true) - $start) * 1000; // ms
$ray->label(substr($query, 0, 40) . '...')->info("${time}ms");}
$ray->groupEnd();?>Yêu cầu Hiệu suất
Phần tiêu đề “Yêu cầu Hiệu suất”<?php$ray = ray();
// Measure total request time$ray->group('Request Metrics');
// Memory usage$memory = memory_get_usage() / 1024 / 1024;$peak = memory_get_peak_usage() / 1024 / 1024;$ray->info("Memory: {$memory}MB / Peak: {$peak}MB");
// Check execution timeif (function_exists('microtime')) { $elapsed = isset($_SERVER['REQUEST_TIME_FLOAT']) ? microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'] : 0; $ray->info("Execution time: {$elapsed}s");}
// File inclusion countif (function_exists('get_included_files')) { $files = count(get_included_files()); $ray->info("Files included: $files");}
$ray->groupEnd();?>Quy trình gỡ lỗi
Phần tiêu đề “Quy trình gỡ lỗi”Gỡ lỗi cài đặt mô-đun
Phần tiêu đề “Gỡ lỗi cài đặt mô-đun”<?php// Create modules/mymodule/debug_install.phprequire_once '../../mainfile.php';require_once XOOPS_ROOT_PATH . '/vendor/autoload.php';
$ray = ray();
$ray->group('Module Installation Debug');
// Check xoopsversion.php$version_file = __DIR__ . '/xoopsversion.php';if (file_exists($version_file)) { $modversion = []; include $version_file; $ray->label('xoopsversion.php')->dump($modversion);} else { $ray->error('xoopsversion.php not found');}
// Check language files$lang_files = glob(__DIR__ . '/language/*/');$ray->label('Language files')->info("Found " . count($lang_files) . " language(s)");
// Check database tables$module = xoops_getHandler('module')->getByDirname(basename(__DIR__));if ($module) { $ray->label('Module ID')->info($module->mid());} else { $ray->warning('Module not in database');}
$ray->groupEnd();
echo "Debug information sent to Ray";?>Gỡ lỗi mẫu
Phần tiêu đề “Gỡ lỗi mẫu”<?php// Check template rendering$ray = ray();
$tpl = new XoopsTpl();
$ray->group('Template Debug');
// Log variables$vars = $tpl->get_template_vars();$ray->label('Available Variables')->dump(array_keys($vars));
// Check template exists$template = 'file:templates/page.html';$ray->info("Template: $template");
// Check compilation$compile_dir = $tpl->getCompileDir();$files = glob($compile_dir . '*.php');$ray->label('Compiled Templates')->info(count($files) . " compiled templates");
$ray->groupEnd();?>Các phương pháp hay nhất
Phần tiêu đề “Các phương pháp hay nhất”graph TD A[Ray Best Practices] --> B["1. Label your logs"] A --> C["2. Group related logs"] A --> D["3. Use appropriate levels"] A --> E["4. Clean up before production"] A --> F["5. Measure performance"]
B --> B1["ray.label().dump()"] C --> C1["ray.group()"] D --> D1["info, warning, error"] E --> E1["Remove ray() calls"] F --> F1["Use ray.measure()"]Tập lệnh dọn dẹp
Phần tiêu đề “Tập lệnh dọn dẹp”<?php// Remove Ray from production// Create script to strip Ray calls
function remove_ray_calls($file) { $content = file_get_contents($file);
// Remove ray() calls $content = preg_replace('/\$ray\s*=\s*ray\(\);/', '', $content); $content = preg_replace('/\$?ray\->[a-zA-Z_][a-zA-Z0-9_]*\([^)]*\);?/', '', $content); $content = preg_replace('/ray\(\)->[a-zA-Z_][a-zA-Z0-9_]*\([^)]*\);?/', '', $content);
file_put_contents($file, $content);}
// Find all PHP files with ray() and remove$files = glob('modules/**/*.php', GLOB_RECURSIVE);foreach ($files as $file) { if (strpos(file_get_contents($file), 'ray()') !== false) { remove_ray_calls($file); echo "Cleaned: $file\n"; }}?>Khắc phục sự cố Ray
Phần tiêu đề “Khắc phục sự cố Ray”Hỏi: Ray không nhận được tin nhắn
Phần tiêu đề “Hỏi: Ray không nhận được tin nhắn”Đ:
- Kiểm tra ứng dụng Ray đang chạy
- Kiểm tra tường lửa cho phép cổng 23517
- Xác minh Ray đã được cài đặt:
composer require spatie/rayHỏi: Không thấy truy vấn SQL
Phần tiêu đề “Hỏi: Không thấy truy vấn SQL”Đ:
<?php// Log queries manually$ray = ray();
$query = "SELECT * FROM xoops_users";$ray->info("Query: $query");
$result = $GLOBALS['xoopsDB']->query($query);
if (!$result) { $ray->error($GLOBALS['xoopsDB']->error);}?>Hỏi: Tác động đến hiệu năng của Ray
Phần tiêu đề “Hỏi: Tác động đến hiệu năng của Ray”A: Ray có chi phí hoạt động tối thiểu. Để sản xuất, hãy xóa cuộc gọi Ray hoặc tắt:
<?php// Disable Ray in productionif (defined('ENVIRONMENT') && ENVIRONMENT == 'production') { function ray(...$args) { return new class { public function __call($name, $args) { return $this; } }; }}?>Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Kích hoạt chế độ gỡ lỗi
- Gỡ lỗi cơ sở dữ liệu
- Câu hỏi thường gặp về hiệu suất
- Hướng dẫn khắc phục sự cố
#xoops #gỡ lỗi #ray #lập hồ sơ #giám sát