php实现并发
PHP 实现并发的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发处理,提高程序执行效率。以下是几种常见的实现方法:
多进程方式 (pcntl_fork)
使用 pcntl_fork 创建子进程实现并发:
$pid = pcntl_fork();
if ($pid == -1) {
die('无法创建子进程');
} elseif ($pid) {
// 父进程代码
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程代码
// 执行任务
exit();
}
注意:此方法仅适用于 CLI 模式,不适用于 Web 服务器环境。
协程 (Coroutine)
使用协程库如 Swoole 或 Revolt 实现轻量级并发:
// 使用 Swoole 协程示例
Swoole\Runtime::enableCoroutine();
go(function () {
// 协程任务1
});
go(function () {
// 协程任务2
});
多线程 (pthreads 扩展)
通过 pthreads 扩展实现多线程(PHP 7+ 已移除官方支持):
class MyThread extends Thread {
public function run() {
// 线程执行代码
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
异步非阻塞 I/O
使用事件循环库如 ReactPHP 实现异步处理:
$loop = React\EventLoop\Factory::create();
$loop->addTimer(0.1, function () {
// 异步任务
});
$loop->run();
队列系统
通过消息队列实现任务分发:
// 使用 Redis 队列示例
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('task_queue', json_encode($taskData));
并行 HTTP 请求
使用 Guzzle 异步客户端实现并行 HTTP 请求:

$client = new GuzzleHttp\Client();
$promises = [
$client->getAsync('http://example.com/1'),
$client->getAsync('http://example.com/2')
];
$results = GuzzleHttp\Promise\unwrap($promises);
选择建议
- CLI 脚本:推荐使用 pcntl_fork 或协程
- Web 应用:推荐使用异步 I/O 或队列系统
- 高性能需求:考虑 Swoole 或 ReactPHP
- 简单任务:Guzzle 异步请求足够
注意事项
- 共享资源需考虑同步问题
- 进程/线程间通信需要特殊处理
- 错误处理要完善,避免僵尸进程
- 生产环境建议使用专业队列系统如 RabbitMQ






