การใช้เรย์ดีบักเกอร์
การใช้ Ray Debugger สำหรับ XOOPS
หัวข้อที่มีชื่อว่า “การใช้ Ray Debugger สำหรับ XOOPS”การแก้ไขจุดบกพร่องสมัยใหม่ด้วย Ray: ตรวจสอบตัวแปร บันทึกข้อความ ติดตามการสืบค้น SQL และประสิทธิภาพของโปรไฟล์ในแอปพลิเคชัน XOOPS ของคุณ
เรย์คืออะไร?
หัวข้อที่มีชื่อว่า “เรย์คืออะไร?”Ray เป็นเครื่องมือแก้ไขจุดบกพร่องขนาดเล็กที่ช่วยให้คุณตรวจสอบสถานะแอปพลิเคชันโดยไม่ต้องหยุดการดำเนินการหรือใช้เบรกพอยต์ เหมาะอย่างยิ่งสำหรับการพัฒนา XOOPS
คุณสมบัติ:
- บันทึกข้อความและตัวแปร
- ตรวจสอบคำสั่ง SQL
- ติดตามประสิทธิภาพ
- รหัสโปรไฟล์
- บันทึกที่เกี่ยวข้องกับกลุ่ม
- เส้นเวลาภาพ
ข้อกำหนด:
- PHP 7.4+
- แอปพลิเคชัน Ray (มีเวอร์ชันฟรี)
- นักแต่งเพลง
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”ขั้นตอนที่ 1: ติดตั้ง Ray Package
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 1: ติดตั้ง Ray Package”cd /path/to/xoops
# Install Ray via Composercomposer require spatie/ray
# Or install globallycomposer global require spatie/rayขั้นตอนที่ 2: ดาวน์โหลดแอป Ray
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 2: ดาวน์โหลดแอป Ray”ดาวน์โหลดจาก ray.so:
- แมค: Ray.app
- วินโดวส์: Ray.exe
- Linux: เรย์ (AppImage)
ขั้นตอนที่ 3: กำหนดค่าไฟร์วอลล์ (หากจำเป็น)
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 3: กำหนดค่าไฟร์วอลล์ (หากจำเป็น)”Ray ใช้พอร์ต 23517 เป็นค่าเริ่มต้น:
# UFWsudo ufw allow 23517/udp
# iptablessudo iptables -A INPUT -p udp --dport 23517 -j ACCEPTการใช้งานขั้นพื้นฐาน
หัวข้อที่มีชื่อว่า “การใช้งานขั้นพื้นฐาน”การบันทึกอย่างง่าย
หัวข้อที่มีชื่อว่า “การบันทึกอย่างง่าย”<?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);?>เอาต์พุตในแอป Ray:
ℹ Page loaded👁 User Data: ['name' => 'John', 'email' => 'john@example.com']ระดับบันทึกที่แตกต่างกัน
หัวข้อที่มีชื่อว่า “ระดับบันทึกที่แตกต่างกัน”<?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');?>ตัวแปรทุ่มตลาด
หัวข้อที่มีชื่อว่า “ตัวแปรทุ่มตลาด”<?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);?>คุณสมบัติขั้นสูง
หัวข้อที่มีชื่อว่า “คุณสมบัติขั้นสูง”1. SQL การติดตามข้อความค้นหา
หัวข้อที่มีชื่อว่า “1. 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. การทำโปรไฟล์ประสิทธิภาพ
หัวข้อที่มีชื่อว่า “2. การทำโปรไฟล์ประสิทธิภาพ”<?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. การดีบักแบบมีเงื่อนไข
หัวข้อที่มีชื่อว่า “3. การดีบักแบบมีเงื่อนไข”<?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. การจัดกลุ่มบันทึกที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “4. การจัดกลุ่มบันทึกที่เกี่ยวข้อง”<?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');});?>XOOPS-การดีบักเฉพาะ
หัวข้อที่มีชื่อว่า “XOOPS-การดีบักเฉพาะ”การดีบักโมดูล
หัวข้อที่มีชื่อว่า “การดีบักโมดูล”<?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);?>การดีบักเทมเพลต
หัวข้อที่มีชื่อว่า “การดีบักเทมเพลต”<?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]);?>การดีบักฐานข้อมูล
หัวข้อที่มีชื่อว่า “การดีบักฐานข้อมูล”<?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();?>ฟังก์ชั่นเรย์แบบกำหนดเอง
หัวข้อที่มีชื่อว่า “ฟังก์ชั่นเรย์แบบกำหนดเอง”สร้างฟังก์ชั่นตัวช่วย
หัวข้อที่มีชื่อว่า “สร้างฟังก์ชั่นตัวช่วย”<?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); }}?>การใช้งาน:
<?phprequire 'class/rayhelper.php';
RayHelper::user();RayHelper::module('mymodule');RayHelper::config('mymodule');?>การตรวจสอบประสิทธิภาพ
หัวข้อที่มีชื่อว่า “การตรวจสอบประสิทธิภาพ”ประสิทธิภาพการสืบค้น
หัวข้อที่มีชื่อว่า “ประสิทธิภาพการสืบค้น”<?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();?>ขอประสิทธิภาพ
หัวข้อที่มีชื่อว่า “ขอประสิทธิภาพ”<?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();?>เวิร์กโฟลว์การดีบัก
หัวข้อที่มีชื่อว่า “เวิร์กโฟลว์การดีบัก”การดีบักการติดตั้งโมดูล
หัวข้อที่มีชื่อว่า “การดีบักการติดตั้งโมดูล”<?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";?>การแก้ไขข้อผิดพลาดเทมเพลต
หัวข้อที่มีชื่อว่า “การแก้ไขข้อผิดพลาดเทมเพลต”<?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();?>แนวทางปฏิบัติที่ดีที่สุด
หัวข้อที่มีชื่อว่า “แนวทางปฏิบัติที่ดีที่สุด”mermaidgraph 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()"]สคริปต์การล้างข้อมูล
หัวข้อที่มีชื่อว่า “สคริปต์การล้างข้อมูล”<?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"; }}?>การแก้ไขปัญหาเรย์
หัวข้อที่มีชื่อว่า “การแก้ไขปัญหาเรย์”ถาม: เรย์ไม่ได้รับข้อความ
หัวข้อที่มีชื่อว่า “ถาม: เรย์ไม่ได้รับข้อความ”ก:
- ตรวจสอบว่าแอป Ray กำลังทำงานอยู่
- ตรวจสอบไฟร์วอลล์อนุญาตพอร์ต 23517
- ตรวจสอบว่าติดตั้ง Ray แล้ว:
composer require spatie/rayถาม: ไม่เห็นข้อความค้นหา SQL
หัวข้อที่มีชื่อว่า “ถาม: ไม่เห็นข้อความค้นหา 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);}?>ถาม: ผลกระทบด้านประสิทธิภาพของ Ray
หัวข้อที่มีชื่อว่า “ถาม: ผลกระทบด้านประสิทธิภาพของ Ray”A: เรย์มีค่าใช้จ่ายน้อยที่สุด สำหรับการผลิต ให้ลบการเรียก Ray หรือปิดใช้งาน:
<?php// Disable Ray in productionif (defined('ENVIRONMENT') && ENVIRONMENT == 'production') { function ray(...$args) { return new class { public function __call($name, $args) { return $this; } }; }}?>เอกสารที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “เอกสารที่เกี่ยวข้อง”- เปิดใช้งานโหมดแก้ไขข้อบกพร่อง
- การดีบักฐานข้อมูล
- ประสิทธิภาพ FAQ
- คู่มือการแก้ไขปัญหา
#xoops #debugging #ray #profile #monitoring