php如何实现并发
PHP 实现并发的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发处理。以下是几种常见的方法:
多进程(PCNTL 扩展)
使用 pcntl_fork 创建子进程实现并发。适用于 CLI 环境,不适用于 Web 环境。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
// 执行并发任务
exit();
}
多线程(Pthreads 扩展)
Pthreads 扩展提供了多线程支持,但仅适用于 PHP 7.x 的线程安全版本(ZTS)。
class AsyncTask extends Thread {
public function run() {
// 并发任务代码
}
}
$thread = new AsyncTask();
$thread->start();
$thread->join();
异步非阻塞(Swoole 扩展)
Swoole 提供了高性能的异步并发能力,支持协程。
// 协程示例
Swoole\Runtime::enableCoroutine();
go(function () {
// 并发任务1
});
go(function () {
// 并发任务2
});
消息队列(Gearman/RabbitMQ)
通过消息队列将任务分发到多个 worker 实现并发。
// Gearman 示例
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job_name', $data);
并行 HTTP 请求(Guzzle 并发)
使用 Guzzle 的异步客户端发送并行 HTTP 请求。
$client = new GuzzleHttp\Client();
$promises = [
$client->getAsync('http://url1'),
$client->getAsync('http://url2')
];
$results = GuzzleHttp\Promise\unwrap($promises);
ReactPHP 事件循环
基于事件循环的异步编程框架。

$loop = React\EventLoop\Factory::create();
$loop->addTimer(0.1, function () {
// 并发任务
});
$loop->run();
注意事项
- Web 环境下通常需要借助扩展或外部服务实现并发
- CLI 环境下有更多选择(如 PCNTL、Pthreads)
- 异步方案(如 Swoole、ReactPHP)性能通常优于多进程/多线程
- 并发编程需注意资源共享和同步问题
性能对比
| 方法 | 适用环境 | 性能 | 复杂度 |
|---|---|---|---|
| PCNTL | CLI | 中 | 中 |
| Pthreads | CLI(ZTS) | 高 | 高 |
| Swoole | All | 很高 | 中 |
| 消息队列 | All | 高 | 高 |
| Guzzle | Web | 中 | 低 |
| ReactPHP | All | 高 | 中 |
根据具体场景选择最适合的并发实现方式。






