fastdlabs / fastD

:rocket: A high performance PHP API framework.
https://fastdlabs.com
MIT License
420 stars 83 forks source link

swoole reload 命令对router无效 #101

Closed fengwuhenyuyousheng closed 6 years ago

fengwuhenyuyousheng commented 6 years ago

swoole模式下,修改了routes文件,使用reload 命令没有效果,需要stop再start

zqhong commented 6 years ago

@fengwuhenyuyousheng

打开 https://github.com/fastdlabs/swoole/blob/master/src/Server.php#L425-L439 在 reload 方法里面重新注册 router 看看。大致类似下面这样:

<?php
/**
 * @return int
 */
public function reload()
{
    if (!$this->isRunning()) {
        $this->output->writeln(sprintf('Server <info>%s</info> is not running...', $this->name));
        return -1;
    }

    $pid = (int)@file_get_contents($this->getPidFile());

    posix_kill($pid, SIGUSR1);

    // 重新注册 router
    app()->offsetUnset('dispatcher');
    app()->offsetUnset('router');
    app()->register(new RouteServiceProvider());

    $this->output->writeln(sprintf('Server <info>%s</info> [<info>%s</info>] is reloading...', $this->name, $pid));

    return 0;
}

我没有测试过,要是你测试没问题的话,欢迎提交 PR~:smile:

@JanHuang 另外,可以考虑在 reload 里面,重新加载应用配置。

RunnerLee commented 6 years ago

自定义一个 HTTPServer 继承 FastD\Servitization\Server\HTTPServer 并重写 reload() 或是 onWorkerStart(), 在 config/server.php 中改为自定义的 Server 类应该就可以的.

JanHuang commented 6 years ago

@zqhong 对,这个应该是由系统去做,应该是框架一个可以提升体验的一个点。

JanHuang commented 6 years ago

目前已经添加对swoole reload的支持。