php 实现多线程
在 PHP 中实现多线程通常需要借助扩展或外部工具,因为 PHP 本身是单线程的。以下是几种常见的实现方法:
使用 pcntl 扩展(仅限 CLI 环境)
pcntl 是 PHP 的一个扩展,允许在 CLI 环境下进行多进程编程。需要注意的是,它不能在 Web 服务器环境下使用。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
echo "Child process\n";
exit();
}
使用 pthreads 扩展(PHP 7 及以下版本)
pthreads 是一个 PHP 扩展,提供了真正的多线程支持,但仅适用于 PHP 7 及以下版本,且需要 ZTS(Zend Thread Safety)版本的 PHP。

class MyThread extends Thread {
public function run() {
echo "Thread running\n";
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
使用 Parallel 扩展(PHP 7.2+)
Parallel 是 pthreads 的替代品,适用于 PHP 7.2 及以上版本。
$runtime = new \parallel\Runtime();
$future = $runtime->run(function() {
return "Task executed in parallel";
});
echo $future->value();
使用多进程模拟多线程
通过启动多个 PHP 进程来模拟多线程效果,可以使用 exec 或 shell_exec 函数。

$commands = [
'php worker.php task1',
'php worker.php task2',
'php worker.php task3'
];
foreach ($commands as $cmd) {
exec("$cmd > /dev/null &");
}
使用消息队列
通过消息队列(如 RabbitMQ、Redis)实现任务分发,多个 worker 进程并行处理任务。
// Producer
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('task_queue', 'task_data');
// Consumer (worker.php)
while (true) {
$task = $redis->brPop('task_queue', 0);
processTask($task);
}
使用 ReactPHP 或 Amp 等异步框架
这些框架通过事件循环实现非阻塞 I/O,可以模拟并发效果。
$loop = React\EventLoop\Factory::create();
$loop->addTimer(1, function () {
echo "Async task\n";
});
$loop->run();
注意事项
- 线程安全问题:共享资源需要加锁或使用线程安全的数据结构
- 环境限制:某些扩展只能在 CLI 模式下工作
- 调试难度:多线程/多进程程序更难调试
- PHP 8+ 版本:目前没有官方支持的多线程解决方案
选择哪种方法取决于具体需求、PHP 版本和运行环境。对于 Web 应用,通常推荐使用消息队列或多进程方案。






