您好,登錄后才能下訂單哦!
本篇內容主要講解“php如何讓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
<?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如何讓Swoole/Pool進程池實現Redis持久連接”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。