Laravel Horizon 使用 proc_open()而不使用pcntl_fork()

1. 独立性和健壮性 (Robustness)

核心需求:隔离失败

Laravel Worker 进程的主要任务是处理来自 Redis 队列的任务。单个任务失败或 Worker 出现内存泄漏、死锁等问题是很常见的。

2. 进程的生命周期管理 (Process Management)

Horizon 的核心功能是监控和管理 Worker 的数量、状态和生命周期。

3. 跨平台和环境兼容性 (Cross-Platform)

这是至关重要的因素之一。

4. 隔离 PHP 解释器 (Environment Isolation)

每个 proc_open 启动的 Worker 都会重新加载 PHP 解释器和 Laravel 框架代码。

总结

尽管 pcntl 在构建高性能、CPU 密集型的 PHP 守护进程方面非常强大,但 Laravel Horizon 的主要目标是可靠地启动、监控和管理多个独立的、隔离的队列 Worker
proc_open() 完美地满足了这些需求:它提供了跨平台的兼容性,实现了进程间的完全隔离,并提供了清晰的 API 来管理子进程的 I/O 和生命周期,从而实现了 Horizon 的核心价值——一个健壮、可配置和可监控的队列管理系统。