php线程池实现
PHP 线程池实现方法
PHP 本身是单线程语言,但可以通过扩展或多进程模拟线程池效果。以下是几种实现方式:
使用 PCNTL 扩展(多进程模拟)
PCNTL 提供进程控制功能,可创建多个子进程模拟线程池:
$poolSize = 5;
$children = [];
for ($i = 0; $i < $poolSize; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} else if ($pid) {
$children[] = $pid;
} else {
// 子进程工作代码
doWork();
exit();
}
}
// 等待所有子进程结束
foreach ($children as $pid) {
pcntl_waitpid($pid, $status);
}
使用 pthreads 扩展(真线程)
需要安装 pthreads 扩展(仅限 CLI 模式):
class WorkerThread extends Thread {
public function __construct($task) {
$this->task = $task;
}
public function run() {
// 执行任务
processTask($this->task);
}
}
$pool = [];
$tasks = [/* 任务数组 */];
foreach ($tasks as $task) {
$worker = new WorkerThread($task);
$worker->start();
$pool[] = $worker;
}
// 等待所有线程完成
foreach ($pool as $worker) {
$worker->join();
}
使用 Gearman 分布式工作系统
Gearman 提供任务分发机制:
$client = new GearmanClient();
$client->addServer();
// 添加多个worker
for ($i = 0; $i < 5; $i++) {
$client->doBackground('worker_function', $workload);
}
使用 Swoole 协程框架
Swoole 提供高性能协程池:

$pool = new Swoole\Process\Pool(5);
$pool->on('WorkerStart', function ($pool, $workerId) {
// 每个worker进程执行任务
while (true) {
$task = getTaskFromQueue();
processTask($task);
}
});
$pool->start();
注意事项
- PCNTL 和 pthreads 只能在 CLI 模式下运行
- 多进程/线程间共享数据需使用共享内存或外部存储
- Swoole 需要安装扩展但性能最佳
- 真线程方案(pthreads)在 PHP 8+ 中已被移除
线程池管理要点
- 控制并发数量防止系统过载
- 实现任务队列机制
- 添加超时和错误处理
- 监控工作进程/线程状态
选择方案应根据具体场景决定,I/O 密集型任务推荐 Swoole,CPU 密集型可考虑多进程方案。






