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

 2721

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


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


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

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

Swoole进程池实现redis数据读取

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

第一步:编码代码

文件:d10.php

  1. <?php
  2.  
  3. use Swoole\Process;
  4. use Swoole\Coroutine;
  5.  
  6. // 指定5个工作进程
  7. $pool = new Process\Pool(5);
  8. // 设置启用协程
  9. $pool->set(['enable_coroutine' => true]);
  10.  
  11. /**
  12. * onWorkerStart 子进程启动
  13. * @param \Swoole\Process\Pool $pool Pool对象
  14. * @param int $workerId   WorkerId当前工作进程的编号,底层会对子进程进行标号
  15. **/
  16. $pool->on("WorkerStart", function (Process\Pool $pool, $workerId) {
  17. // 输出当前工作进程
  18.    echo "Worker #{$workerId} is started\n";
  19.  
  20.    // 实例化化连接redis
  21.    $redis = new Redis();
  22.    $redis->pconnect('127.0.0.1', 6379);
  23.    // 指定redis键
  24.    $key = "key1";
  25.  
  26.    // 循环读取列表数据
  27.    while (true) {
  28.     // 弹出列表最后一个元素
  29.        $msgs = $redis->brpop($key, 2);
  30.        // 元素值为空则跳过
  31.        if ( $msgs == null) {
  32.            continue;
  33.        }
  34.        // 打印获取的值
  35.        var_dump($msgs);
  36.        echo "Processed by Worker#{$workerId}\n";
  37.    }
  38. });
  39.  
  40. // 子进程结束
  41. $pool->on("WorkerStop", function ($pool, $workerId) {
  42.    echo "Worker#{$workerId} is stopped\n";
  43. });
  44.  
  45. // 启动工作进程
  46. $pool->start();

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

该案例需要php安装redis扩展

  1. # 通过redis客户端连接
  2. ./redis-cli
  3.  
  4. 127.0.0.1:6379> lpush key1 'world'

第三步:运行d10.php

  1. php d10.php

第四步:查看进程

  1. ps aux | grep php
  2. 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)
  3. www         951  0.0  0.6 129164  6636 ?        S    Apr21   0:00 php-fpm: pool www
  4. www         952  0.0  0.6 129164  6640 ?        S    Apr21   0:00 php-fpm: pool www
  5. root      12327  0.0  1.2 126992 12800 pts/2    S+   00:02   0:00 php d10.php
  6. root      12328  0.0  0.7 131096  7444 pts/2    S+   00:02   0:00 php d10.php
  7. root      12329  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
  8. root      12330  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
  9. root      12331  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
  10. root      12332  0.0  0.7 131096  7448 pts/2    S+   00:02   0:00 php d10.php
  11. root      12355  0.0  0.0 112812   976 pts/3    R+   00:09   0:00 grep --color=auto php

第五步:输出结果

  1. php d10.php
  2.  
  3. Worker #1 is started
  4. Worker #2 is started
  5. Worker #3 is started
  6. Worker #4 is started
  7. Worker #0 is started
  8. array(2) {
  9.  [0]=>
  10.  string(4) "key1"
  11.  [1]=>
  12.  string(5) "world"
  13. }
  14. Processed by Worker#1

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


本文网址:https://www.zztuku.com/index.php/detail-13782.html
站长图库 - 聊聊PHP怎么让Swoole/Pool进程池实现Redis持久连接
申明:本文转载于《ziruchu》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐