- 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.
51 lines
1.5 KiB
PHP
51 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Framework\Queue;
|
|
|
|
use App\Framework\Core\PathProvider;
|
|
use App\Framework\DI\Initializer;
|
|
use App\Framework\Logging\Logger;
|
|
use App\Framework\Logging\ValueObjects\LogContext;
|
|
use App\Framework\Queue\Exceptions\RedisExtensionNotLoadedException;
|
|
use App\Framework\Redis\RedisConfig;
|
|
use App\Framework\Redis\RedisConnection;
|
|
|
|
final readonly class QueueInitializer
|
|
{
|
|
public function __construct(
|
|
private PathProvider $pathProvider
|
|
) {
|
|
}
|
|
|
|
#[Initializer]
|
|
public function __invoke(Logger $logger): Queue
|
|
{
|
|
try {
|
|
// Check if Redis extension is available
|
|
if (! extension_loaded('redis')) {
|
|
throw RedisExtensionNotLoadedException::notLoaded();
|
|
}
|
|
|
|
$redisConfig = new RedisConfig(
|
|
host: 'redis',
|
|
port: 6379,
|
|
database: 2 // Use DB 2 for queue
|
|
);
|
|
$redisConnection = new RedisConnection($redisConfig, 'queue');
|
|
|
|
return new RedisQueue($redisConnection, 'commands');
|
|
} catch (\Throwable $e) {
|
|
// Fallback to file queue if Redis is not available
|
|
$logger->info("Using file queue (Redis not available)", LogContext::withData([
|
|
'reason' => $e->getMessage(),
|
|
'fallback' => 'FileQueue',
|
|
]));
|
|
$path = $this->pathProvider->resolvePath('/storage/queue/');
|
|
|
|
return new FileQueue($path, logger: $logger);
|
|
}
|
|
}
|
|
}
|