php实现并发
PHP 实现并发的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发处理。以下是几种常见的方法:
多进程(PCNTL 扩展)
使用 pcntl_fork 创建子进程,每个子进程独立执行任务。适用于 CLI 模式。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// Parent process
pcntl_wait($status); // Wait for child to finish
} else {
// Child process
echo "Child process\n";
exit();
}
多线程(Pthreads 扩展)
Pthreads 扩展提供了多线程支持,但仅适用于 CLI 模式且需要线程安全的 PHP 版本。

class MyThread extends Thread {
public function run() {
echo "Thread running\n";
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
异步任务(Gearman)
使用 Gearman 分发任务到多个工作进程,实现并发处理。
$client = new GearmanClient();
$client->addServer();
$client->doBackground("task_name", "task_data");
协程(Swoole 扩展)
Swoole 提供了协程支持,可以在单个线程内实现高并发。

Co\run(function () {
go(function () {
echo "Coroutine 1\n";
});
go(function () {
echo "Coroutine 2\n";
});
});
消息队列(RabbitMQ/Redis)
使用消息队列将任务分发到多个消费者进程,实现并发处理。
$channel->queue_declare('task_queue', false, true, false, false);
$channel->basic_publish($msg, '', 'task_queue');
并行 HTTP 请求(Guzzle)
使用 Guzzle 的异步客户端发送多个 HTTP 请求,实现并发。
$client = new \GuzzleHttp\Client();
$promises = [
$client->getAsync('http://example.com'),
$client->getAsync('http://example.org')
];
\GuzzleHttp\Promise\Utils::unwrap($promises);
注意事项
- 多进程和多线程方法通常只适用于 CLI 模式
- Web 环境下推荐使用消息队列或异步任务
- Swoole 提供了完整的协程支持,适合高性能场景
- 确保服务器资源足够处理并发任务






