Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请问下worker中如何实现类似controller这样的结构 #6

Open
ifdandy opened this issue Apr 20, 2022 · 3 comments
Open

请问下worker中如何实现类似controller这样的结构 #6

ifdandy opened this issue Apr 20, 2022 · 3 comments

Comments

@ifdandy
Copy link

ifdandy commented Apr 20, 2022

看了官网的demo,所有的业务逻辑都是写在worker.php里面,这样会导致业务逻辑很复杂,我想的是能不能我自己实现一个logic逻辑来处理不同的业务,在里面可以使用worker启动时候初始化的redis和db连接,而不是重复实例化。

@ifdandy
Copy link
Author

ifdandy commented Apr 20, 2022

对了,如果作者还在的话,能不能加我qq:2335563089

@xielei
Copy link
Owner

xielei commented Apr 20, 2022

看了官网的demo,所有的业务逻辑都是写在worker.php里面,这样会导致业务逻辑很复杂,我想的是能不能我自己实现一个logic逻辑来处理不同的业务,在里面可以使用worker启动时候初始化的redis和db连接,而不是重复实例化。

大致方法如下,在onworkerstart里面初始化所有事件

在onrecive里面根据数据解析得到事件名,然后执行。

配置里面的自动重载目录加上 events 目录

代码没验证

worker.php

<?php

declare(strict_types=1);

use Xielei\Swoole\Helper\WorkerEvent as HelperWorkerEvent;

class WorkerEvent extends HelperWorkerEvent
{
    private $events = [];

    public function onWorkerStart()
    {
        $events = [];
        foreach (glob(__DIR__ . '/events/*.php') as $file) {
            $name = basename($file, '.php');
            $events[$name] = require $file;
        }
        $this->events = $events;
    }

    public function onReceive(string $client, array $session, string $data)
    {
        $event = self::getEventFromBuff($data);
        call_user_func($this->events[$event], $client, $session, $data, $this);
    }

    public static function getEventFromBuff($data): string
    {
        return '...';
    }
}

事件方法

<?php
// 返回一个function
return function (string $client, array $session, string $buff, $worker) {
    // todo..
};

@ifdandy
Copy link
Author

ifdandy commented Apr 20, 2022

相当于把redis对象传入方法中提供调用,这样代码感觉比较难管理,如果能提供依赖注入或者全局this对象方式获取就更好了。还有就是task也有点不方便,如果我想在task里面执行redis或者db操作,还是一样要传入这个连接对象。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants