Menggunakan Ray Debugger
Menggunakan Ray Debugger untuk XOOPS
Section titled “Menggunakan Ray Debugger untuk XOOPS”Debugging modern dengan Ray: memeriksa variabel, mencatat pesan, melacak kueri SQL, dan kinerja profil di aplikasi XOOPS Anda.
Apa itu Ray?
Section titled “Apa itu Ray?”Ray adalah alat debugging ringan yang membantu Anda memeriksa status aplikasi tanpa menghentikan eksekusi atau menggunakan breakpoint. Ini sempurna untuk pengembangan XOOPS.
Fitur:
- Catat pesan dan variabel
- Periksa pertanyaan SQL
- Lacak kinerja
- Kode profil
- Log terkait grup
- Garis waktu visual
Persyaratan:
- PHP 7.4+
- Aplikasi Ray (tersedia versi gratis)
- Komposer
Instalasi
Section titled “Instalasi”Langkah 1: Instal Paket Ray
Section titled “Langkah 1: Instal Paket Ray”cd /path/to/xoops
# Install Ray via Composercomposer require spatie/ray
# Or install globallycomposer global require spatie/rayLangkah 2: Unduh Aplikasi Ray
Section titled “Langkah 2: Unduh Aplikasi Ray”Unduh dari ray.so:
- Mac: Ray.app
- Windows: Ray.exe
- Linux: sinar (AppImage)
Langkah 3: Konfigurasikan Firewall (jika diperlukan)
Section titled “Langkah 3: Konfigurasikan Firewall (jika diperlukan)”Ray menggunakan port 23517 secara default:
# UFWsudo ufw allow 23517/udp
# iptablessudo iptables -A INPUT -p udp --dport 23517 -j ACCEPTPenggunaan Dasar
Section titled “Penggunaan Dasar”Pencatatan Sederhana
Section titled “Pencatatan Sederhana”<?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);?>Keluaran di aplikasi Ray:
ℹ Page loaded👁 User Data: ['name' => 'John', 'email' => 'john@example.com']Level Log Berbeda
Section titled “Level Log Berbeda”<?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');?>Variabel Pembuangan
Section titled “Variabel Pembuangan”<?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);?>Fitur Lanjutan
Section titled “Fitur Lanjutan”1. Pelacakan Kueri SQL
Section titled “1. Pelacakan Kueri 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. Profil Kinerja
Section titled “2. Profil Kinerja”<?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. Debugging Bersyarat
Section titled “3. Debugging Bersyarat”<?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. Mengelompokkan Log Terkait
Section titled “4. Mengelompokkan Log Terkait”<?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-Debug Khusus
Section titled “XOOPS-Debug Khusus”Proses Debug module
Section titled “Proses Debug module”<?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);?>Proses Debug template
Section titled “Proses Debug 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]);?>Proses Debug Basis Data
Section titled “Proses Debug Basis Data”<?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();?>Fungsi Sinar Khusus
Section titled “Fungsi Sinar Khusus”Membuat Fungsi Pembantu
Section titled “Membuat Fungsi Pembantu”<?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); }}?>Penggunaan:
<?phprequire 'class/rayhelper.php';
RayHelper::user();RayHelper::module('mymodule');RayHelper::config('mymodule');?>Pemantauan Kinerja
Section titled “Pemantauan Kinerja”Performa Kueri
Section titled “Performa Kueri”<?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();?>Kinerja Permintaan
Section titled “Kinerja Permintaan”<?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();?>Men-debug Alur Kerja
Section titled “Men-debug Alur Kerja”Debugging Instalasi module
Section titled “Debugging Instalasi module”<?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";?>Kesalahan template Saat Men-debug
Section titled “Kesalahan template Saat Men-debug”<?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();?>Praktik Terbaik
Section titled “Praktik Terbaik”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()"]Skrip Pembersihan
Section titled “Skrip Pembersihan”<?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"; }}?>Mengatasi Masalah Ray
Section titled “Mengatasi Masalah Ray”Q: Ray tidak menerima pesan
Section titled “Q: Ray tidak menerima pesan”J:
- Periksa aplikasi Ray sedang berjalan
- Periksa firewall mengizinkan port 23517
- Pastikan Ray sudah terinstal:
composer require spatie/rayT: Tidak dapat melihat kueri SQL
Section titled “T: Tidak dapat melihat kueri SQL”J:
<?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);}?>T: Dampak performa Ray
Section titled “T: Dampak performa Ray”A: Ray memiliki overhead minimal. Untuk produksi, hapus panggilan Ray atau nonaktifkan:
<?php// Disable Ray in productionif (defined('ENVIRONMENT') && ENVIRONMENT == 'production') { function ray(...$args) { return new class { public function __call($name, $args) { return $this; } }; }}?>Dokumentasi Terkait
Section titled “Dokumentasi Terkait”- Aktifkan Mode Debug
- Debugging Basis Data
- FAQ Kinerja
- Panduan Mengatasi Masalah
#xoops #debugging #ray #profiling #monitoring