2023-02-08

聊聊php怎么让Swoole/Pool进程池实现Redis持久连接

本篇文章给大家带来了关于php的相关知识,其中主要介绍了通过PHPphp让Swoole/Pool进程池实现Redis持久连接,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

php 让 Swoole | Pool进程池实现Redis持久连接

进程池,基于Swoole/Server的Manager管理进程模块实现。可管理多个工作进程,相比 Process 实现多进程,Process/Pool 更加简单,封装层次更高,开发者无需编写过多代码即可实现进程管理功能,配合 Co/Server 可以创建纯协程风格的,能利用多核 CPU 的服务端程序。

Swoole进程池实现redis数据读取

如下案例,通过WorkerStart启动Redis进程池,并持久读取Redis列表数据;当WorkerStop断开所有连接时回收所有子进程。

第一步:编码代码

文件:d10.php

<?php

use Swoole/Process;
use Swoole/Coroutine;

// 指定5个工作进程
$pool = new Process/Pool(5);
// 设置启用协程
$pool->set(['enable_coroutine' => true]);

/**
* onWorkerStart 子进程启动
* @param /Swoole/Process/Pool $pool Pool对象
* @param int $workerId   WorkerId当前工作进程的编号,底层会对子进程进行标号
**/
$pool->on("WorkerStart", function (Process/Pool $pool, $workerId) {
// 输出当前工作进程
   echo "Worker #{$workerId} is started/n";

   // 实例化化连接redis
   $redis = new Redis();
   $redis->pconnect('127.0.0.1', 6379);
   // 指定redis键
   $key = "key1";

   // 循环读取列表数据
   while (true) {
    // 弹出列表最后一个元素
       $msgs = $redis->brpop($key, 2);
       // 元素值为空则跳过
       if ( $msgs == null) {
           continue;
       }
       // 打印获取的值
       var_dump($msgs);
       echo "Processed by Worker#{$workerId}/n";
   }
});

// 子进程结束
$pool->on("WorkerStop", function ($pool, $workerId) {
   echo "Worker#{$workerId} is stopped/n";
});

// 启动工作进程
$pool->start();
登录后复制

第二步:启动Redis服务并通过客户端写列表数据

该案例需要php安装redis扩展

# 通过redis客户端连接
./redis-cli

127.0.0.1:6379> lpush key1 'world'
登录后复制

复制代码

第三步:运行d10.php

php d10.php
登录后复制

第四步:查看进程

ps aux | grep php
root        938  0.0  1.2 129164 12412 ?        Ss   Apr21   0:00 php-fpm: master process (/usr/local/php-8.0.1/etc/php-fpm.conf)
www         951  0.0  0.6 129164  6636 ?        S    Apr21   0:00 php-fpm: pool www
www         952  0.0  0.6 129164  6640 ?        S    Apr21   0:00 php-fpm: pool www
root      12327  0.0  1.2 126992 12800 pts/2    S+   00:02   0:00 php d10.php
root      12328  0.0  0.7 131096  7444 pts/2    S+   00:02   0:00 php d10.php
root      12329  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
root      12330  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
root      12331  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
root      12332  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
root      12355  0.0  0.0 112812   976 pts/3    R+   00:09   0:00 grep --color=auto php
登录后复制

第五步:输出结果

php d10.php

Worker #1 is started
Worker #2 is started
Worker #3 is started
Worker #4 is started
Worker #0 is started
array(2) {
 [0]=>
 string(4) "key1"
 [1]=>
 string(5) "world"
}
Processed by Worker#1
登录后复制

d10.php文件运行后会一直处于阻塞状态而一直读取redis列表数据,一旦Redis列表中输出,则立刻被弹出并打印在屏幕中。

推荐学习:《PHP视频教程

以上就是聊聊php怎么让Swoole/Pool进程池实现Redis持久连接的详细内容,更多请关注php中文网其它相关文章!

声明:本文转载于:ziruchu,如有侵犯,请联系admin@php.cn删除

  • 相关标签:php
  • https://www.php.cn/php-weizijiaocheng-500774.html

    发表回复

    Your email address will not be published. Required fields are marked *