php 实现并发
PHP 实现并发的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发处理,提高程序执行效率。以下是几种常见的实现方法:
多进程方式(PCNTL扩展)
使用 PHP 的 PCNTL 扩展可以创建多个子进程来实现并发。每个子进程独立运行,互不干扰。
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程代码
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程代码
exit();
}
多线程方式(Pthreads扩展)
Pthreads 扩展为 PHP 提供了多线程能力,但需要注意线程安全问题。
class MyThread extends Thread {
public function run() {
// 线程执行的代码
}
}
$thread = new MyThread();
$thread->start();
$thread->join();
异步非阻塞方式(Swoole扩展)
Swoole 是一个高性能的 PHP 异步网络通信引擎,支持协程、多线程等特性。
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->on('request', function ($request, $response) {
$response->end("Hello World");
});
$server->start();
消息队列方式
使用消息队列(如 RabbitMQ、Beanstalkd)可以实现任务分发和并发处理。
// 生产者
$queue = new PhpAmqpLib\Connection\AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $queue->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$msg = new PhpAmqpLib\Message\AMQPMessage($data);
$channel->basic_publish($msg, '', 'task_queue');
// 消费者
$callback = function($msg) {
// 处理任务
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
协程方式(Swoole/Guzzle)
协程可以在单线程内实现并发,适合 IO 密集型任务。

Co\run(function() {
$client = new Swoole\Coroutine\Http\Client('www.example.com', 80);
$client->get('/');
echo $client->body;
});
注意事项
- 多进程和多线程方式需要考虑资源竞争和同步问题
- 异步非阻塞方式需要特定的扩展支持
- 消息队列方式需要额外的中间件支持
- 协程方式对代码结构有一定要求,需要避免阻塞操作
根据具体应用场景选择合适的并发实现方式,IO 密集型任务适合异步非阻塞或协程方式,CPU 密集型任务适合多进程方式。






