php线程池实现
PHP 线程池实现方法
PHP 本身是单线程语言,但可以通过扩展或库实现类似线程池的功能。以下是几种常见实现方式:
使用 pcntl 扩展(仅限 CLI 环境)
pcntl 是 PHP 的多进程控制扩展,可用于创建进程池:

$poolSize = 5;
$children = [];
for ($i = 0; $i < $poolSize; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
$children[] = $pid;
} else {
// 子进程工作代码
sleep(rand(1, 3));
exit();
}
}
// 等待所有子进程结束
foreach ($children as $pid) {
pcntl_waitpid($pid, $status);
}
使用 pthreads 扩展(需要 ZTS 版 PHP)
pthreads 提供了真正的多线程支持:
class WorkerThread extends Thread {
public function run() {
// 线程执行的任务
}
}
$pool = [];
for ($i = 0; $i < 5; $i++) {
$pool[$i] = new WorkerThread();
$pool[$i]->start();
}
使用 ReactPHP 或 Amp 等异步框架
这些框架通过事件循环实现并发:

$loop = React\EventLoop\Factory::create();
$pool = new React\ChildProcess\Pool(5, $loop);
$pool->on('worker', function ($process) {
$process->on('exit', function() {
echo "Process exited\n";
});
});
$loop->run();
使用 Gearman 等任务队列系统
Gearman 提供分布式工作系统:
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", function($job) {
return strrev($job->workload());
});
while ($worker->work());
使用 Swoole 扩展
Swoole 提供了高性能的协程和进程管理:
$pool = new Swoole\Process\Pool(5);
$pool->on("WorkerStart", function ($pool, $workerId) {
echo "Worker#{$workerId} is started\n";
});
$pool->on("WorkerStop", function ($pool, $workerId) {
echo "Worker#{$workerId} is stopped\n";
});
$pool->start();
注意事项
- 线程安全:确保 PHP 编译时启用了 ZTS(Zend Thread Safety)选项
- 共享资源:多线程/进程环境下需要处理好资源共享和锁机制
- 环境限制:部分扩展如 pcntl 只能在 CLI 模式下使用
- 错误处理:需要完善的进程/线程监控和重启机制
选择哪种方案取决于具体需求,对于 CPU 密集型任务推荐使用多进程,I/O 密集型任务可考虑异步或协程方案。






