Files
michaelschiemer/examples/livecomponent-profiling-usage.php
Michael Schiemer fc3d7e6357 feat(Production): Complete production deployment infrastructure
- Add comprehensive health check system with multiple endpoints
- Add Prometheus metrics endpoint
- Add production logging configurations (5 strategies)
- Add complete deployment documentation suite:
  * QUICKSTART.md - 30-minute deployment guide
  * DEPLOYMENT_CHECKLIST.md - Printable verification checklist
  * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle
  * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference
  * production-logging.md - Logging configuration guide
  * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation
  * README.md - Navigation hub
  * DEPLOYMENT_SUMMARY.md - Executive summary
- Add deployment scripts and automation
- Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment
- Update README with production-ready features

All production infrastructure is now complete and ready for deployment.
2025-10-25 19:18:37 +02:00

381 lines
11 KiB
PHP

<?php
declare(strict_types=1);
/**
* LiveComponent Performance Profiling Usage Examples
*
* Dieses Script demonstriert die Performance-Profiling-Integration
* für LiveComponents mit Timeline-Visualisierung.
*
* Ausführung: php examples/livecomponent-profiling-usage.php
*/
require_once __DIR__ . '/../vendor/autoload.php';
use App\Framework\Performance\NestedPerformanceTracker;
use App\Framework\Performance\PerformanceCategory;
use App\Framework\DateTime\SystemClock;
use App\Framework\DateTime\SystemHighResolutionClock;
use App\Framework\Performance\MemoryMonitor;
// Tracker initialisieren
$tracker = new NestedPerformanceTracker(
new SystemClock(),
new SystemHighResolutionClock(),
new MemoryMonitor()
);
echo "=== LiveComponent Performance Profiling Examples ===\n\n";
// Example 1: Component Lifecycle Profiling
echo "Example 1: Component Lifecycle Profiling\n";
echo str_repeat('-', 50) . "\n";
// Simuliere kompletten LiveComponent Lifecycle
$tracker->measure(
'livecomponent.counter.increment',
PerformanceCategory::CUSTOM,
function () use ($tracker) {
// 1. Schema Derive/Cache
$tracker->measure(
'livecomponent.schema.derive',
PerformanceCategory::CACHE,
function () {
usleep(500); // 0.5ms - Schema aus Cache
},
['component' => 'counter']
);
// 2. Action Execute
$tracker->measure(
'livecomponent.action.execute',
PerformanceCategory::CUSTOM,
function () {
usleep(2000); // 2ms - Business Logic
},
['action' => 'increment', 'component' => 'counter']
);
// 3. State Validate
$tracker->measure(
'livecomponent.state.validate',
PerformanceCategory::CUSTOM,
function () {
usleep(300); // 0.3ms - Validation
},
['component' => 'counter']
);
// 4. Lifecycle Hook onUpdate
$tracker->measure(
'livecomponent.lifecycle.onUpdate',
PerformanceCategory::CUSTOM,
function () {
usleep(100); // 0.1ms - Hook
},
['component' => 'counter']
);
},
['component' => 'counter', 'action' => 'increment']
);
// Timeline ausgeben
echo "\nComponent Action Timeline:\n";
$timeline = $tracker->generateTimeline();
foreach ($timeline as $event) {
$indent = str_repeat(' ', $event['depth']);
echo sprintf(
" %s[%s] %s (%.2fms)\n",
$indent,
$event['category'],
$event['name'],
$event['duration_ms']
);
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 2: Component Render Profiling
echo "Example 2: Component Render Profiling\n";
echo str_repeat('-', 50) . "\n";
$tracker->reset();
// Simuliere Component Render mit Cache
$tracker->measure(
'livecomponent.render.user-card',
PerformanceCategory::VIEW,
function () use ($tracker) {
// 1. Cache Get (Hit)
$tracker->measure(
'livecomponent.cache.get',
PerformanceCategory::CACHE,
function () {
usleep(300); // 0.3ms - Cache Hit
return ['html' => '<div>cached</div>', 'needs_refresh' => false];
},
['component' => 'user-card']
);
},
['component' => 'user-card']
);
// Simuliere Component Render ohne Cache
$tracker->measure(
'livecomponent.render.product-list',
PerformanceCategory::VIEW,
function () use ($tracker) {
// 1. Cache Get (Miss)
$tracker->measure(
'livecomponent.cache.get',
PerformanceCategory::CACHE,
function () {
usleep(200); // 0.2ms - Cache Miss
return ['html' => null, 'needs_refresh' => false];
},
['component' => 'product-list']
);
// 2. Get Render Data
$tracker->measure(
'livecomponent.getRenderData',
PerformanceCategory::CUSTOM,
function () {
usleep(1000); // 1ms - Data preparation
},
['component' => 'product-list']
);
// 3. Template Render
$tracker->measure(
'livecomponent.template.render',
PerformanceCategory::TEMPLATE,
function () use ($tracker) {
usleep(5000); // 5ms - Template rendering
// Nested: Template processors
$tracker->measure(
'template.processor.placeholder',
PerformanceCategory::TEMPLATE,
function () {
usleep(1000); // 1ms
}
);
$tracker->measure(
'template.processor.component',
PerformanceCategory::TEMPLATE,
function () {
usleep(2000); // 2ms
}
);
},
['component' => 'product-list', 'template' => 'components/product-list.view.php']
);
// 4. Cache Set
$tracker->measure(
'livecomponent.cache.set',
PerformanceCategory::CACHE,
function () {
usleep(400); // 0.4ms - Cache storage
},
['component' => 'product-list']
);
},
['component' => 'product-list']
);
echo "\nComponent Render Timeline:\n";
$timeline = $tracker->generateTimeline();
foreach ($timeline as $event) {
$indent = str_repeat(' ', $event['depth']);
$contextInfo = !empty($event['context']['template'])
? " ({$event['context']['template']})"
: '';
echo sprintf(
" %s[%s] %s%s (%.2fms self, %.2fms total)\n",
$indent,
$event['category'],
$event['name'],
$contextInfo,
$event['self_time_ms'],
$event['duration_ms']
);
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 3: Multiple Component Actions (Flamegraph)
echo "Example 3: Multiple Component Actions (Flamegraph)\n";
echo str_repeat('-', 50) . "\n";
$tracker->reset();
// Simuliere mehrere Component Actions
for ($i = 0; $i < 3; $i++) {
$tracker->measure(
'livecomponent.search.updateQuery',
PerformanceCategory::CUSTOM,
function () use ($tracker) {
$tracker->measure(
'livecomponent.action.execute',
PerformanceCategory::CUSTOM,
function () {
usleep(3000); // 3ms
}
);
$tracker->measure(
'livecomponent.state.validate',
PerformanceCategory::CUSTOM,
function () {
usleep(500); // 0.5ms
}
);
},
['component' => 'search', 'action' => 'updateQuery']
);
}
echo "\nFlamegraph Data (aggregated):\n";
$flamegraph = $tracker->generateFlamegraph();
foreach ($flamegraph as $entry) {
echo sprintf(
" %s → %.1f samples\n",
$entry['stack_trace'],
$entry['samples']
);
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 4: Performance Budget Validation for LiveComponents
echo "Example 4: Performance Budget Validation\n";
echo str_repeat('-', 50) . "\n";
$budgets = [
'livecomponent.action.execute' => 5, // max 5ms for actions
'livecomponent.template.render' => 10, // max 10ms for templates
'livecomponent.cache.get' => 1, // max 1ms for cache
'livecomponent.render' => 20, // max 20ms total render
];
$violations = [];
foreach ($timeline as $event) {
foreach ($budgets as $operation => $budget) {
if (str_contains($event['name'], $operation)) {
if ($event['duration_ms'] > $budget) {
$violations[] = [
'operation' => $event['name'],
'component' => $event['context']['component'] ?? 'unknown',
'duration' => $event['duration_ms'],
'budget' => $budget,
'exceeded_by' => $event['duration_ms'] - $budget,
'percentage' => (($event['duration_ms'] - $budget) / $budget) * 100
];
}
}
}
}
if (!empty($violations)) {
echo "\n⚠️ Performance Budget Violations:\n";
foreach ($violations as $violation) {
echo sprintf(
" • [%s] %s: %.2fms (budget: %.2fms, exceeded by %.2fms / %.1f%%)\n",
$violation['component'],
$violation['operation'],
$violation['duration'],
$violation['budget'],
$violation['exceeded_by'],
$violation['percentage']
);
}
} else {
echo "\n✅ All LiveComponent operations within performance budget!\n";
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 5: Export für Chrome DevTools
echo "Example 5: Chrome DevTools Export\n";
echo str_repeat('-', 50) . "\n";
// Generate full timeline with all examples
$fullTimeline = $tracker->generateTimeline();
// Convert to Chrome Trace Event Format
$traceEvents = [];
foreach ($fullTimeline as $event) {
// Begin Event
$traceEvents[] = [
'name' => $event['name'],
'cat' => $event['category'],
'ph' => 'B',
'ts' => (int)($event['start_time'] * 1_000_000),
'pid' => 1,
'tid' => 1,
'args' => $event['context']
];
// End Event
$traceEvents[] = [
'name' => $event['name'],
'cat' => $event['category'],
'ph' => 'E',
'ts' => (int)($event['end_time'] * 1_000_000),
'pid' => 1,
'tid' => 1
];
}
$chromeTrace = [
'traceEvents' => $traceEvents,
'displayTimeUnit' => 'ms',
'otherData' => [
'version' => '1.0',
'framework' => 'Custom PHP Framework - LiveComponents',
'profiler' => 'NestedPerformanceTracker'
]
];
$chromeTraceFile = __DIR__ . '/../tests/tmp/livecomponent-trace.json';
@mkdir(dirname($chromeTraceFile), 0755, true);
file_put_contents($chromeTraceFile, json_encode($chromeTrace, JSON_PRETTY_PRINT));
echo "\nChrome Trace saved to: {$chromeTraceFile}\n";
echo "View in Chrome DevTools:\n";
echo " 1. Open Chrome and navigate to: chrome://tracing\n";
echo " 2. Click 'Load' and select: {$chromeTraceFile}\n";
echo " 3. Explore the LiveComponent lifecycle timeline\n";
echo "\n" . str_repeat('=', 50) . "\n\n";
// Summary
echo "✅ LiveComponent Performance Profiling Examples completed!\n\n";
echo "Generated Files:\n";
echo "{$chromeTraceFile}\n\n";
echo "Key Insights:\n";
echo " • LiveComponent actions are fully traced with nested operations\n";
echo " • Component render pipeline is profiled (cache → render → template)\n";
echo " • Lifecycle hooks (onMount, onUpdate) are measured\n";
echo " • Performance budgets can be validated per component\n";
echo " • Chrome DevTools integration for visual analysis\n\n";
echo "Next Steps:\n";
echo " 1. Load trace in Chrome DevTools for visual timeline\n";
echo " 2. Identify slow component actions and rendering\n";
echo " 3. Set performance budgets for production monitoring\n";
echo " 4. Integrate with logging for continuous profiling\n\n";