php 实现并发
PHP 实现并发的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发处理任务。以下是几种常见的方法:
多进程(PCNTL 扩展)
使用 pcntl_fork 创建子进程,每个子进程独立执行任务。适用于长时间运行的任务。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} else if ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
// 执行任务代码
exit();
}
多线程(Pthreads 扩展)
Pthreads 提供了多线程支持,但需要线程安全的 PHP 版本(ZTS)。
class MyThread extends Thread {
public function run() {
// 线程任务代码
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
异步任务(Gearman)
Gearman 是一个分布式任务调度系统,可以异步处理任务。
$client = new GearmanClient();
$client->addServer();
$client->doBackground('task_name', 'task_data');
消息队列(RabbitMQ/Beanstalkd)
通过消息队列实现任务异步处理,提高并发能力。
// RabbitMQ 示例
$connection = new AMQPConnection();
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$msg = new AMQPMessage($task_data);
$channel->basic_publish($msg, '', 'task_queue');
协程(Swoole)
Swoole 是一个高性能 PHP 协程框架,支持真正的并发。
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->on('Request', function ($request, $response) {
// 协程任务
Co::sleep(1); // 非阻塞 sleep
$response->end("Hello Swoole");
});
$server->start();
并行 HTTP 请求(Guzzle)
使用 Guzzle 的异步客户端发送多个 HTTP 请求。
$client = new GuzzleHttp\Client();
$promises = [
$client->getAsync('http://example.com/1'),
$client->getAsync('http://example.com/2')
];
$results = GuzzleHttp\Promise\unwrap($promises);
选择建议
- 简单任务:考虑多进程或 Guzzle 异步请求
- 高性能需求:使用 Swoole 协程
- 分布式系统:选择 Gearman 或消息队列
- 计算密集型:Pthreads(需 ZTS 环境)
每种方法都有适用场景,应根据具体需求选择最合适的方案。







