php实现并行
PHP 实现并行的方法
PHP 本身是单线程语言,但可以通过多种方式实现并行处理任务,以下是一些常见的方法:
多进程处理(PCNTL 扩展)
使用 pcntl_fork 创建子进程,适用于 CLI 环境:
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
sleep(2);
echo "Child process done\n";
exit(0);
}
多线程处理(pthreads 扩展)
PHP 的 pthreads 扩展提供了多线程支持,但仅适用于 CLI 模式且需要 ZTS 版本的 PHP:

class MyThread extends Thread {
public function run() {
echo "Thread running\n";
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
异步任务(Gearman)
使用 Gearman 分发任务到多个 worker 实现并行:
$client = new GearmanClient();
$client->addServer();
$client->doBackground('reverse', 'Hello World');
协程(Swoole 扩展)
Swoole 提供了协程支持,可实现高效的并行 IO 操作:

Swoole\Runtime::enableCoroutine();
go(function () {
echo "Coroutine 1\n";
});
go(function () {
echo "Coroutine 2\n";
});
并行 HTTP 请求(Guzzle 异步)
使用 Guzzle 的异步请求实现并行 HTTP 调用:
$client = new GuzzleHttp\Client();
$promises = [
$client->getAsync('http://example.com'),
$client->getAsync('http://example.org')
];
$results = GuzzleHttp\Promise\unwrap($promises);
消息队列(RabbitMQ/Redis)
通过消息队列实现任务并行处理:
$connection = new AMQPConnection();
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'task_queue');
选择建议
- 对于 CPU 密集型任务:推荐使用多进程(PCNTL)或多线程(pthreads)
- 对于 IO 密集型任务:推荐使用协程(Swoole)或异步 HTTP 请求
- 对于分布式任务:推荐使用消息队列或 Gearman
- Web 环境下:通常使用异步 HTTP 或消息队列方案
注意:多线程和部分扩展需要特定 PHP 版本和编译选项,使用前需确认环境支持。






