Webman控制器与自定义进程通信的最佳姿势?

bigjason

从swoole过来,今天在评估是否可以用webman开发下一个项目,发现基本都满足需求,但是有一个问题没搞明白:请问webman的控制器如何与自定义进程通信?

比如这是我的自定义进程,基本目的是本地缓存多个小数据,组成batch然后发送到sqs

class Sqs
{
    private $queueData = [];

    public function onWorkerStart()
    {
        // 每隔5秒 flush 到 sqs
        Timer::add(5, function(){
            $currentData = array_splice($this->queueData, 0);
            file_put_contents('/tmp/sqs,txt', var_export($currentData, true), FILE_APPEND);
        });
    }

    public function onMessage(TcpConnection $connection, $data)
    {
        echo "onMessage\n";
        echo "$data\n";

        $this->queueData[] = $data;
    }
}

目前看文档好像有两种方式:

  1. process配置listen,然后用tcpconnection连接,比如:
    // config/process.php
    'sqs'=>[
    'handler' => process\Sqs::class,
    'listen'  => 'text://0.0.0.0:9090',
    ]
// IndexController.php
function index(){
    if(!$process){
        $process = new TcpConnection('text://0.0.0.0:9090');
    }

    $process->send("some data...");
}

2 用Channel分布式通讯组件,感觉走了弯路

有没有在控制器里面直接往这个自定义进程发送数据的方法?类似
process('Sqs')->write("some data.....")

1274 2 6
2个回答

evilk

这个涉及到进程间通信
推荐走text协议,通过tcp发送数据给自定义进程

  • 暂无评论
walkor

没有process('Sqs')->write("some data.....")这样的方法,你可以自己封装。
给sqs进程发送数据可以考虑使用udp,消耗小,速度快,不阻塞进程。
直接用stream_socket_client就行, 类似

$client = stream_socket_client('udp://127.0.0.1:9090');
stream_socket_sendto($client, "数据");

可以自己封装下

年代过于久远,无法发表回答
🔝