- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
350 lines
8.0 KiB
Markdown
350 lines
8.0 KiB
Markdown
# Framework Performance
|
|
|
|
> Performance optimization features and monitoring built into the PHP framework.
|
|
|
|
## 🔧 Built-in Performance Features
|
|
|
|
### Connection Pooling
|
|
|
|
The framework includes advanced database connection pooling with health monitoring:
|
|
|
|
```php
|
|
// Automatic connection pooling
|
|
$pool = new ConnectionPool([
|
|
'min_connections' => 5,
|
|
'max_connections' => 20,
|
|
'idle_timeout' => 300,
|
|
'health_check_interval' => 60
|
|
]);
|
|
|
|
// Health monitoring
|
|
$healthChecker = new ConnectionHealthChecker($pool);
|
|
$healthStatus = $healthChecker->checkHealth();
|
|
```
|
|
|
|
### Query Optimization
|
|
|
|
#### N+1 Query Prevention
|
|
The framework automatically detects and eliminates N+1 queries:
|
|
|
|
```php
|
|
// Automatic eager loading detection
|
|
$users = $userRepository->findWithRelations(['posts', 'comments']);
|
|
|
|
// Batch loading for performance
|
|
$posts = $postRepository->loadBatch($userIds);
|
|
```
|
|
|
|
#### Query Caching
|
|
Built-in query result caching with intelligent invalidation:
|
|
|
|
```php
|
|
// Cache configuration
|
|
$cacheConfig = [
|
|
'default_ttl' => 3600,
|
|
'strategy' => 'write-through',
|
|
'invalidation' => 'tag-based'
|
|
];
|
|
|
|
// Automatic query caching
|
|
$result = $repository->findCached('user-posts-' . $userId);
|
|
```
|
|
|
|
### View System Performance
|
|
|
|
#### Template Compilation
|
|
PHP templates are compiled and cached for optimal performance:
|
|
|
|
```php
|
|
// Template compilation
|
|
$viewProcessor = new ViewProcessor([
|
|
'cache_path' => '/var/cache/views',
|
|
'auto_reload' => false, // Production setting
|
|
'optimize' => true
|
|
]);
|
|
```
|
|
|
|
#### Fragment Caching
|
|
Cache expensive template fragments:
|
|
|
|
```html
|
|
<!-- Fragment caching in templates -->
|
|
<cache key="user-stats-<?= $userId ?>" ttl="3600">
|
|
<?php foreach($stats as $stat): ?>
|
|
<div class="stat"><?= $stat->render() ?></div>
|
|
<?php endforeach; ?>
|
|
</cache>
|
|
```
|
|
|
|
## 📊 Performance Monitoring
|
|
|
|
### Analytics Integration
|
|
|
|
The framework includes comprehensive performance analytics:
|
|
|
|
```php
|
|
// Performance monitoring
|
|
class PerformanceMiddleware implements HttpMiddleware
|
|
{
|
|
public function handle(Request $request, Next $next): Response
|
|
{
|
|
$startTime = microtime(true);
|
|
$startMemory = memory_get_usage();
|
|
|
|
$response = $next($request);
|
|
|
|
$this->recordMetrics([
|
|
'duration' => microtime(true) - $startTime,
|
|
'memory' => memory_get_usage() - $startMemory,
|
|
'route' => $request->getRoute(),
|
|
'status' => $response->getStatusCode()
|
|
]);
|
|
|
|
return $response;
|
|
}
|
|
}
|
|
```
|
|
|
|
### Database Performance Tracking
|
|
|
|
Monitor database query performance automatically:
|
|
|
|
```php
|
|
// Query performance logging
|
|
class QueryLogger implements QueryMiddleware
|
|
{
|
|
public function beforeQuery(string $sql, array $params): void
|
|
{
|
|
$this->startTime = microtime(true);
|
|
}
|
|
|
|
public function afterQuery(string $sql, array $params): void
|
|
{
|
|
$duration = microtime(true) - $this->startTime;
|
|
|
|
if ($duration > 0.1) { // Log slow queries
|
|
$this->logger->warning('Slow query detected', [
|
|
'sql' => $sql,
|
|
'duration' => $duration,
|
|
'params' => $params
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🚀 Optimization Strategies
|
|
|
|
### HTTP Layer Optimizations
|
|
|
|
#### Response Compression
|
|
Automatic response compression based on content type:
|
|
|
|
```php
|
|
// Compression middleware
|
|
class CompressionMiddleware implements HttpMiddleware
|
|
{
|
|
public function handle(Request $request, Next $next): Response
|
|
{
|
|
$response = $next($request);
|
|
|
|
if ($this->shouldCompress($response)) {
|
|
return $this->compress($response);
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
}
|
|
```
|
|
|
|
#### HTTP Caching
|
|
Intelligent HTTP caching with ETag support:
|
|
|
|
```php
|
|
// Cache headers
|
|
$response->headers->set('Cache-Control', 'public, max-age=3600');
|
|
$response->headers->set('ETag', hash('sha256', $content));
|
|
|
|
// Conditional requests
|
|
if ($request->headers->get('If-None-Match') === $etag) {
|
|
return new Response('', 304);
|
|
}
|
|
```
|
|
|
|
### Asset Optimization
|
|
|
|
#### Static File Serving
|
|
Optimized static file serving with proper headers:
|
|
|
|
```nginx
|
|
# Nginx configuration for static assets
|
|
location /assets/ {
|
|
expires 1y;
|
|
add_header Cache-Control "public, immutable";
|
|
add_header Vary "Accept-Encoding";
|
|
|
|
gzip_static on;
|
|
brotli_static on;
|
|
}
|
|
```
|
|
|
|
#### Asset Bundling
|
|
Framework integration with Vite for optimal asset bundling:
|
|
|
|
```php
|
|
// Asset helper
|
|
class AssetHelper
|
|
{
|
|
public function getAssetUrl(string $asset): string
|
|
{
|
|
$manifest = $this->loadManifest();
|
|
return $manifest[$asset]['url'] ?? $asset;
|
|
}
|
|
|
|
public function getCriticalCss(): string
|
|
{
|
|
return $this->inlineAsset('critical.css');
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🔍 Performance Profiling
|
|
|
|
### Built-in Profiler
|
|
|
|
Enable the framework profiler for detailed performance analysis:
|
|
|
|
```php
|
|
// Profiler configuration
|
|
$profiler = new FrameworkProfiler([
|
|
'enabled' => $this->isDebugMode(),
|
|
'storage' => 'file', // or 'redis'
|
|
'threshold' => 100, // ms
|
|
'collect' => [
|
|
'queries',
|
|
'views',
|
|
'cache',
|
|
'events'
|
|
]
|
|
]);
|
|
```
|
|
|
|
### Memory Usage Tracking
|
|
|
|
Monitor memory usage throughout the request lifecycle:
|
|
|
|
```php
|
|
// Memory tracking
|
|
class MemoryTracker
|
|
{
|
|
public function trackOperation(string $operation, callable $callback)
|
|
{
|
|
$beforeMemory = memory_get_usage(true);
|
|
$beforePeak = memory_get_peak_usage(true);
|
|
|
|
$result = $callback();
|
|
|
|
$afterMemory = memory_get_usage(true);
|
|
$afterPeak = memory_get_peak_usage(true);
|
|
|
|
$this->recordMemoryUsage([
|
|
'operation' => $operation,
|
|
'memory_used' => $afterMemory - $beforeMemory,
|
|
'peak_increase' => $afterPeak - $beforePeak
|
|
]);
|
|
|
|
return $result;
|
|
}
|
|
}
|
|
```
|
|
|
|
## ⚡ Performance Best Practices
|
|
|
|
### Database Best Practices
|
|
|
|
1. **Use Indexes**: Ensure proper database indexing
|
|
2. **Lazy Loading**: Load data only when needed
|
|
3. **Batch Operations**: Group database operations
|
|
4. **Connection Reuse**: Leverage connection pooling
|
|
|
|
```php
|
|
// Efficient database operations
|
|
class UserService
|
|
{
|
|
public function getUsersWithPosts(array $userIds): array
|
|
{
|
|
// Single query with join instead of N+1
|
|
return $this->repository->findUsersWithPosts($userIds);
|
|
}
|
|
|
|
public function batchUpdateUsers(array $updates): void
|
|
{
|
|
// Batch update instead of individual queries
|
|
$this->repository->batchUpdate($updates);
|
|
}
|
|
}
|
|
```
|
|
|
|
### View Optimization
|
|
|
|
1. **Template Caching**: Cache compiled templates
|
|
2. **Fragment Caching**: Cache expensive view fragments
|
|
3. **Lazy Loading**: Load view components on demand
|
|
4. **Asset Optimization**: Minify and compress assets
|
|
|
|
```php
|
|
// Optimized view rendering
|
|
class OptimizedViewController
|
|
{
|
|
public function render(string $template, array $data): Response
|
|
{
|
|
// Use cached template if available
|
|
$compiled = $this->templateCache->get($template);
|
|
|
|
if (!$compiled) {
|
|
$compiled = $this->compiler->compile($template);
|
|
$this->templateCache->set($template, $compiled);
|
|
}
|
|
|
|
return $this->renderCompiled($compiled, $data);
|
|
}
|
|
}
|
|
```
|
|
|
|
## 📈 Monitoring & Alerts
|
|
|
|
### Performance Metrics Collection
|
|
|
|
Collect and analyze key performance metrics:
|
|
|
|
```php
|
|
// Metrics collection
|
|
$metrics = [
|
|
'response_time' => $responseTime,
|
|
'memory_usage' => memory_get_peak_usage(true),
|
|
'database_queries' => $queryCount,
|
|
'cache_hits' => $cacheHits,
|
|
'cache_misses' => $cacheMisses
|
|
];
|
|
|
|
$this->metricsCollector->record($metrics);
|
|
```
|
|
|
|
### Alert Configuration
|
|
|
|
Set up alerts for performance degradation:
|
|
|
|
```php
|
|
// Performance alerts
|
|
$alertConfig = [
|
|
'response_time_threshold' => 1000, // ms
|
|
'memory_threshold' => 128 * 1024 * 1024, // 128MB
|
|
'query_count_threshold' => 50,
|
|
'error_rate_threshold' => 0.01 // 1%
|
|
];
|
|
```
|
|
|
|
---
|
|
|
|
*For general performance guidelines, see [Performance Guidelines](../../development/performance.md)*
|
|
*For analytics configuration, see [Analytics System](../analytics/README.md)* |