שימוש ב-Ray Debugger
שימוש ב-Ray Debugger עבור XOOPS
Section titled “שימוש ב-Ray Debugger עבור XOOPS”איתור באגים מודרני עם Ray: בדוק משתנים, הודעות יומן, עקוב אחר שאילתות SQL וביצועי פרופיל ביישום XOOPS שלך.
מה זה ריי?
Section titled “מה זה ריי?”Ray הוא כלי קל משקל לניפוי באגים שעוזר לך לבדוק את מצב היישום מבלי להפסיק את הביצוע או להשתמש בנקודות שבירה. זה מושלם לפיתוח XOOPS.
תכונות:
- יומן הודעות ומשתנים
- בדוק שאילתות SQL
- עקוב אחר ביצועים
- קוד פרופיל
- יומנים הקשורים לקבוצה
- ציר זמן חזותי
דרישות:
- PHP 7.4+
- אפליקציית Ray (גרסה חינמית זמינה)
- Composer
שלב 1: התקן את חבילת Ray
Section titled “שלב 1: התקן את חבילת Ray”cd /path/to/xoops
# Install Ray via Composercomposer require spatie/ray
# Or install globallycomposer global require spatie/rayשלב 2: הורד את אפליקציית Ray
Section titled “שלב 2: הורד את אפליקציית Ray”הורד מ-ray.so:
- Mac: Ray.app
- Windows: Ray.exe
- לינוקס: ריי (AppImage)
שלב 3: הגדר חומת אש (במידת הצורך)
Section titled “שלב 3: הגדר חומת אש (במידת הצורך)”Ray משתמש ביציאה 23517 כברירת מחדל:
# UFWsudo ufw allow 23517/udp
# iptablessudo iptables -A INPUT -p udp --dport 23517 -j ACCEPTשימוש בסיסי
Section titled “שימוש בסיסי”רישום פשוט
Section titled “רישום פשוט”<?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']רמות יומן שונות
Section titled “רמות יומן שונות”<?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');?>שחרור משתנים
Section titled “שחרור משתנים”<?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);?>תכונות מתקדמות
Section titled “תכונות מתקדמות”1. SQL מעקב אחר שאילתות
Section titled “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. פרופיל ביצועים
Section titled “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. ניפוי באגים מותנה
Section titled “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. קיבוץ יומנים קשורים
Section titled “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-ניפוי באגים ספציפי
Section titled “XOOPS-ניפוי באגים ספציפי”איתור באגים של מודול
Section titled “איתור באגים של מודול”<?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);?>איתור באגים בתבנית
Section titled “איתור באגים בתבנית”<?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]);?>איתור באגים במסד נתונים
Section titled “איתור באגים במסד נתונים”<?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();?>פונקציות ריי מותאמות אישית
Section titled “פונקציות ריי מותאמות אישית”צור פונקציות עוזר
Section titled “צור פונקציות עוזר”<?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');?>ניטור ביצועים
Section titled “ניטור ביצועים”ביצועי שאילתות
Section titled “ביצועי שאילתות”<?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();?>בקש ביצוע
Section titled “בקש ביצוע”<?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();?>איתור באגים בזרימות עבודה
Section titled “איתור באגים בזרימות עבודה”ניפוי באגים בהתקנת מודול
Section titled “ניפוי באגים בהתקנת מודול”<?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";?>שגיאת תבנית ניפוי באגים
Section titled “שגיאת תבנית ניפוי באגים”<?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();?>שיטות עבודה מומלצות
Section titled “שיטות עבודה מומלצות”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()"]סקריפט ניקוי
Section titled “סקריפט ניקוי”<?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
Section titled “פתרון בעיות Ray”ש: ריי לא מקבל הודעות
Section titled “ש: ריי לא מקבל הודעות”ת:
- בדוק שהאפליקציה Ray פועלת
- בדוק שחומת האש מאפשרת יציאה 23517
- ודא ש-Ray מותקן:
composer require spatie/rayש: לא ניתן לראות שאילתות של SQL
Section titled “ש: לא ניתן לראות שאילתות של 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
Section titled “ש: השפעת הביצועים של Ray”ת: לריי יש תקורה מינימלית. להפקה, הסר קריאות ריי או השבת:
<?php// Disable Ray in productionif (defined('ENVIRONMENT') && ENVIRONMENT == 'production') { function ray(...$args) { return new class { public function __call($name, $args) { return $this; } }; }}?>תיעוד קשור
Section titled “תיעוד קשור”- הפעל מצב ניפוי באגים
- איתור באגים במסד נתונים
- ביצועים FAQ
- מדריך לפתרון בעיות
#xoops #debugging #ray #profiling #ניטור