作者:高人arm | 来源:互联网 | 2024-11-19 14:58
Swoole 是一个高性能的 PHP 异步并发框架,广泛应用于构建高并发的服务端应用。下面是一个官方推荐的代码示例,展示了如何在 WorkerStart
回调中创建 Redis 连接,并将其挂载到 swoole_server
对象上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $serv = new swoole_server("0.0.0.0", 9502);
$serv->on('workerstart', function($serv, $id) { $redis = new Redis; $redis->connect('127.0.0.1', 6379); $serv->redis = $redis; });
$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { $value = $serv->redis->get("key"); $serv->send($fd, "Swoole: " . $value); });
$serv->start(); |
在上述代码中,虽然 $serv->redis
对象被所有客户端共享,但实际操作中,每个工作进程(worker)会独立运行,因此每个工作进程中的 $serv->redis
实际上是不同的实例。这意味着不同客户端的操作不会相互影响。
如果你将代码封装在一个类中,可以考虑使用类属性来存储需要跨方法访问的数据。例如:
$a = 1;
表示在当前作用域内定义了一个局部变量 a
。
$this->a = 1;
表示在类的实例中定义了一个属性 a
,可以在类的任何方法中访问。
$serv->a = 1;
则是在 swoole_server
对象上定义了一个属性 a
,同样可以在服务器生命周期内的任何地方访问。
对于高并发场景,如客户端并发达到 10 万时,建议使用数据库连接池来管理数据库连接,以提高性能和资源利用率。你可以设置一个连接池,例如 100 个连接,然后通过连接池来获取和释放连接,而不是为每个请求单独创建连接。
如果客户端是长连接,首次连接时发送的唯一标识(如 MAC 地址)可以存储在会话或内存中,以便后续请求时使用。例如,可以在 WorkerStart
回调中初始化一个数组来存储这些标识,然后在 Receive
回调中根据客户端的文件描述符(FD)来查找和更新这些信息。