Usando Ray Debugger
Usando Ray Debugger para XOOPS
Seção intitulada “Usando Ray Debugger para XOOPS”Depuração moderna com Ray: inspecione variáveis, registre mensagens, rastreie queries SQL e perfil de performance na sua aplicação XOOPS.
O que é Ray?
Seção intitulada “O que é Ray?”Ray é uma ferramenta de depuração leve que ajuda você a inspecionar o estado da aplicação sem parar a execução ou usar pontos de interrupção. É perfeito para desenvolvimento do XOOPS.
Recursos:
- Registre mensagens e variáveis
- Inspecione queries SQL
- Rastreie performance
- Perfil de código
- Agrupe logs relacionados
- Timeline visual
Requisitos:
- PHP 7.4+
- Aplicação Ray (versão gratuita disponível)
- Composer
Instalação
Seção intitulada “Instalação”Passo 1: Instalar Pacote Ray
Seção intitulada “Passo 1: Instalar Pacote Ray”cd /path/to/xoops
# Install Ray via Composercomposer require spatie/ray
# Or install globallycomposer global require spatie/rayPasso 2: Baixar Aplicação Ray
Seção intitulada “Passo 2: Baixar Aplicação Ray”Baixar de ray.so:
- Mac: Ray.app
- Windows: Ray.exe
- Linux: ray (AppImage)
Passo 3: Configurar Firewall (se necessário)
Seção intitulada “Passo 3: Configurar Firewall (se necessário)”Ray usa porta 23517 por padrão:
# UFWsudo ufw allow 23517/udp
# iptablessudo iptables -A INPUT -p udp --dport 23517 -j ACCEPTUso Básico
Seção intitulada “Uso Básico”Registro Simples
Seção intitulada “Registro Simples”<?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);?>Saída na aplicação Ray:
ℹ Page loaded👁 User Data: ['name' => 'John', 'email' => 'john@example.com']Diferentes Níveis de Log
Seção intitulada “Diferentes Níveis de Log”<?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');?>Despejando Variáveis
Seção intitulada “Despejando Variáveis”<?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);?>Recursos Avançados
Seção intitulada “Recursos Avançados”1. Rastreamento de Query SQL
Seção intitulada “1. Rastreamento de Query 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. Perfil de Performance
Seção intitulada “2. Perfil de Performance”<?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. Depuração Condicional
Seção intitulada “3. Depuração Condicional”<?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. Agrupando Logs Relacionados
Seção intitulada “4. Agrupando Logs Relacionados”<?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');});?>Depuração Específica do XOOPS
Seção intitulada “Depuração Específica do XOOPS”Depuração de Módulo
Seção intitulada “Depuração de Módulo”<?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);?>Depuração de Template
Seção intitulada “Depuração de Template”<?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]);?>Depuração de Banco de Dados
Seção intitulada “Depuração de Banco de Dados”<?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();?>Funções Ray Customizadas
Seção intitulada “Funções Ray Customizadas”Criar Funções Auxiliares
Seção intitulada “Criar Funções Auxiliares”<?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); }}?>Uso:
<?phprequire 'class/rayhelper.php';
RayHelper::user();RayHelper::module('mymodule');RayHelper::config('mymodule');?>Monitoramento de Performance
Seção intitulada “Monitoramento de Performance”Performance de Query
Seção intitulada “Performance de Query”<?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();?>Performance de Requisição
Seção intitulada “Performance de Requisição”<?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();?>Fluxos de Trabalho de Depuração
Seção intitulada “Fluxos de Trabalho de Depuração”Depuração de Instalação de Módulo
Seção intitulada “Depuração de Instalação de Módulo”<?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";?>Depuração de Erro de Template
Seção intitulada “Depuração de Erro de Template”<?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();?>Boas Práticas
Seção intitulada “Boas Práticas”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()"]Script de Limpeza
Seção intitulada “Script de Limpeza”<?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"; }}?>Solução de Problemas com Ray
Seção intitulada “Solução de Problemas com Ray”P: Ray não recebe mensagens
Seção intitulada “P: Ray não recebe mensagens”R:
- Verificar se aplicação Ray está em execução
- Verificar firewall permite porta 23517
- Verificar se Ray está instalado:
composer require spatie/rayP: Não consigo ver queries SQL
Seção intitulada “P: Não consigo ver queries SQL”R:
<?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);}?>P: Impacto de performance do Ray
Seção intitulada “P: Impacto de performance do Ray”R: Ray tem overhead mínimo. Para produção, remova chamadas Ray ou desative:
<?php// Disable Ray in productionif (defined('ENVIRONMENT') && ENVIRONMENT == 'production') { function ray(...$args) { return new class { public function __call($name, $args) { return $this; } }; }}?>Documentação Relacionada
Seção intitulada “Documentação Relacionada”- Ativar Modo Debug
- Depuração de Banco de Dados
- FAQ de Performance
- Guia de Solução de Problemas
#xoops #debugging #ray #profiling #monitoring