php如何让Swoole/Pool进程池实现Redis持久连接

后端开发   发布日期:2023年06月10日   浏览次数:496

本篇内容主要讲解“php如何让Swoole/Pool进程池实现Redis持久连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何让Swoole/Pool进程池实现Redis持久连接”吧!

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

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

Swoole进程池实现redis数据读取

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

第一步:编码代码

文件:d10.php

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

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

该案例需要php安装redis扩展

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

复制代码

第三步:运行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. Worker #1 is started
  3. Worker #2 is started
  4. Worker #3 is started
  5. Worker #4 is started
  6. Worker #0 is started
  7. array(2) {
  8. [0]=>
  9. string(4) "key1"
  10. [1]=>
  11. string(5) "world"
  12. }
  13. Processed by Worker#1

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

以上就是php如何让Swoole/Pool进程池实现Redis持久连接的详细内容,更多关于php如何让Swoole/Pool进程池实现Redis持久连接的资料请关注九品源码其它相关文章!