二十七、Swoole 基础学习笔记 - 通过案例学习 Swoole Process\Pool 进程池的使用
hi,我是温新,一名PHPer
文章基于 Swoole 5.0.1 版本编写。
学习目标:自己同手写案例
说明:本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!
本篇文章通过两个官方文档中案例进行学习。
进程池实现 redis 持久连接
本篇通过进程实现一个队列效果
<?php
// 27-swoole-process-pool.php
$pool = new Swoole\Process\Pool(3);
$pool->on('WorkerStart', function ($pool, $workerId) {
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
$key = 'name';
while (true) {
$msgs = $redis->brpop($key, 2);
if ($msgs == null) {
continue;
}
echo '处理进程:' . $workerId . PHP_EOL;
print_r($msgs);
}
});
$pool->on('WorkerStop', function (\Swoole\Process\Pool $pool, $workerId) {
echo("[Worker #{$workerId}] WorkerStop\n");
});
$pool->start();
redis 中写入数据
127.0.0.1:6379> lpush name a b c
启动服务,输出结果如下
$php 27-swoole-process.php
处理进程:1
处理进程:2
Array
(
[0] => name
[1] => a
)
Array
(
[0] => name
[1] => c
)
处理进程:0
Array
(
[0] => name
[1] => b
)
注意看处理的进程。
服务端、客户端发送消息
服务端代码
<?php
// 27-swoole-process-pool-write.php
$pool = new Swoole\Process\Pool(2, SWOOLE_IPC_SOCKET);
$pool->on("Message", function ($pool, $message) {
echo '处理进程:' . $pool->getProcess()->pid . " Message: {$message}\n";
$pool->write("hello ");
$pool->write("world ");
$pool->write("\n");
});
$pool->listen('127.0.0.1', 8089);
$pool->start();
客户端代码
<?php
// 27-swoole-process-pool-client.php
$fp = stream_socket_client("tcp://127.0.0.1:8089", $errno, $errstr) or die("error: $errstr\n");
$msg = json_encode(['data' => 'hello', 'uid' => 1991]);
fwrite($fp, pack('N', strlen($msg)) . $msg);
sleep(1);
//将显示 hello world\n
$data = fread($fp, 8192);
var_dump(substr($data, 4, unpack('N', substr($data, 0, 4))[1]));
fclose($fp);
输出结果
$php 27-swoole-process-pool-write.php
处理进程:60350 Message: {"data":"hello","uid":1991}
处理进程:60351 Message: {"data":"hello","uid":1991}
处理进程:60350 Message: {"data":"hello","uid":1991}
处理进程:60351 Message: {"data":"hello","uid":1991}
# 多发送几次
$php 27-swoole-process-pool-client.php
本篇文章结束
请登录后再评论