二十七、Swoole 基础学习笔记 - 通过案例学习 Swoole Process\Pool 进程池的使用

作者: 温新

分类: 【Swoole 系列】

阅读: 1495

时间: 2023-03-13 12:02:08

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 

本篇文章结束

请登录后再评论