聊聊PHP怎么让Swoole/Pool进程池实现Redis持久连接
2721
本篇文章给大家带来了关于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列表中输出,则立刻被弹出并打印在屏幕中
本文网址:https://www.zztuku.com/index.php/detail-13782.html
站长图库 - 聊聊PHP怎么让Swoole/Pool进程池实现Redis持久连接
申明:本文转载于《ziruchu》,如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!