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

if (!function_exists('pcntl_fork')) {
die('PCNTL extension is required');
}
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
// 执行并行任务
exit();
}
Gearman 任务队列
Gearman 是一个分布式任务调度系统,可以将任务分配给多个工作进程并行执行。
$client = new GearmanClient();
$client->addServer();
// 异步执行任务
$client->doBackground('task_name', 'task_data');
// 同步执行多个任务
$results = [];
$client->addTask('task1', 'data1', null, 'task1');
$client->addTask('task2', 'data2', null, 'task2');
$client->runTasks();
foreach ($results as $task => $result) {
echo "Task $task result: $result";
}
Swoole 协程
Swoole 是一个 PHP 的协程并发框架,可以轻松实现并行处理。

Swoole\Runtime::enableCoroutine();
go(function () {
// 任务1
});
go(function () {
// 任务2
});
// 等待所有协程完成
Swoole\Event::wait();
ReactPHP 事件循环
ReactPHP 是一个基于事件循环的库,可以实现非阻塞 I/O 和并行处理。
$loop = React\EventLoop\Factory::create();
$loop->addTimer(0, function () {
// 并行任务1
});
$loop->addTimer(0, function () {
// 并行任务2
});
$loop->run();
并行 HTTP 请求(Guzzle)
使用 Guzzle 的异步客户端可以并行发送多个 HTTP 请求。
$client = new GuzzleHttp\Client();
$promises = [
'request1' => $client->getAsync('http://example.com/1'),
'request2' => $client->getAsync('http://example.com/2')
];
$results = GuzzleHttp\Promise\Utils::unwrap($promises);
foreach ($results as $key => $response) {
echo $key . ': ' . $response->getBody();
}
选择合适的方法
- 对于 CPU 密集型任务:PCNTL 或多进程
- 对于 I/O 密集型任务:Swoole 或 ReactPHP
- 对于分布式任务:Gearman
- 对于 HTTP 请求并行:Guzzle
每种方法都有其适用场景,应根据具体需求选择最合适的实现方式。






