php如何实现并发
PHP实现并发的方法
PHP本身是单线程语言,但可以通过多种方式实现并发处理。以下是几种常见的实现方法:
多进程方式(PCNTL扩展)
使用PHP的PCNTL扩展可以创建多个子进程来并行处理任务。需要确保PHP已安装PCNTL扩展。

$pid = pcntl_fork();
if ($pid == -1) {
die('无法创建子进程');
} elseif ($pid) {
// 父进程代码
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程代码
// 执行具体任务
exit(); // 子进程结束
}
使用cURL多请求
对于HTTP请求并发,可以使用cURL的multi接口同时发起多个请求。
$mh = curl_multi_init();
$handles = [];
for ($i = 0; $i < 5; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/api/$i");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
// 处理响应
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
Gearman任务分发
Gearman是一个分布式任务分发系统,可以将任务分发到多个worker上并行处理。

$client = new GearmanClient();
$client->addServer();
// 异步执行多个任务
$client->doBackground('task1', 'data1');
$client->doBackground('task2', 'data2');
Swoole扩展
Swoole是一个高性能的PHP协程并发框架,支持真正的多线程和协程。
$serv = new Swoole\Server("0.0.0.0", 9501);
$serv->on('Receive', function ($serv, $fd, $reactor_id, $data) {
// 创建协程并发处理
go(function () use ($data) {
// 协程1处理
});
go(function () use ($data) {
// 协程2处理
});
});
$serv->start();
ReactPHP异步编程
ReactPHP是一个基于事件驱动的PHP库,可以实现非阻塞I/O操作。
$loop = React\EventLoop\Factory::create();
$loop->addTimer(0.1, function () {
// 异步任务1
});
$loop->addTimer(0.2, function () {
// 异步任务2
});
$loop->run();
选择方法的考虑因素
- 对于CPU密集型任务,多进程方式(PCNTL)或Swoole更合适
- 对于I/O密集型任务,cURL多请求或ReactPHP等异步方案更高效
- 分布式环境下,Gearman等消息队列方案更适合
- Swoole提供了最高性能的解决方案,但需要安装额外扩展
每种方法都有其适用场景,应根据具体需求选择最合适的并发实现方式。





