webman/event 这个插件如何才能做到修改文件后重新加载

kspade
webman插件地址:https://www.workerman.net/plugin/64

composer require webman/event

订阅事件统一通过文件config/event.php来配置

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...其它事件处理函数...
    ]
];

文件:app\event\User 里面的内容修改后怎么才能刷新同步

我参考官方admin的reloadWebman 重启代码

    public static function reloadWebman()
    {
        if (function_exists('posix_kill')) {
            try {
                posix_kill(posix_getppid(), SIGUSR1);
                return true;
            } catch (Throwable $e) {}
        } else {
            Timer::add(1, function () {
                Worker::stopAll();
            });
        }
        return false;
    }

测试了终端显示:Workerman[webman] reloading

发布事件后拿到的返回数据还是修改之前的

Event::emit("user.register", $data);

并且我新开一个终端使用:php webman restart 重启的webman 也不行,内容依旧没有变

必须要stop 停止webman 后 重新启动 才能同步

求解如何才能修改文件后,自动更新这个文件里面的内容啊

734 2 5
2个回答

kspade

相当重要啊 没有大佬吗

  • 暂无评论
walkor 打赏

把webman stop停止,执行 ps aux 看下是还有进程在运行,可能有其它地方启动了webman没停止。

app\event\User::class 如果在创建子进程前就加载了,那就不支持reload。
看下app\event\User::class类是不是在哪里提前使用了。

  • kspade 2023-08-29

    原因
    'user.register' => [
    [app\event\User::class, 'register'],
    ],

    其中的:app\event\User::class 问题

    由于我的这个是遍历目录所有文件进行动态添加的
    $path = app\event\User;
    $class = get_class($path);

    最终:
    'user.register' => [
    [$class, 'register'],
    ],

    我是这样的所以它没法自动刷新,老大请问一下app\event\User::class 这个动态的写法该怎么写啊
    $reflectionClass = new ReflectionClass($path );
    $fullyQualifiedName = $reflectionClass->getName();
    这样也不行 get_class 就好像把文件占用了一样不会二次加载

  • kspade 2023-08-29

    解决了 直接给路径就行了,不需要::class

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