hyperf命令行与协程

简介: hyperf命令行与协程

hyperf命令行与协程


背景


需要自定义命令行Command 启动附属的Server服务


记录一下引发的几个问题


无法启动


产生报错


Swoole\Server::start(): eventLoop has already been created, unable to start Swoole\Server


原因:Command中已经开启了协程无法再监听server


Co::create(function(){
    $server = new Server('0.0.0.0', 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP);
    $server->start();
});


处理方案,在Command类中定义属性,关闭协程


class StartCommand extends HyperfCommand
{
    /**
     * Execution in a coroutine environment.
     */
    protected $coroutine = false;
    // .....
}


关闭协程后的问题


查看hyperf-command组件代码 核心如下


if ($this->coroutine && ! Coroutine::inCoroutine()) {
    run($callback, $this->hookFlags);
    return $this->exitCode;
}
return $callback();


开启了协程之后会传递hookFlags参数


在关闭协程之后 一些心跳函数里我写了如下代码


Coroutine::create(function(){
    while(true){
        // foreach send 
        \Hyperf\Utils\Coroutine::sleep(3);
    }
});


但是由于默认没有hook了,而Hyperf utils中使用的不是Swoole提供的sleep函数,所以会造成进程堵塞。导致其他逻辑无法运行。


解决方案:在server set里设置hook


$server->set([
    'worker_num' => 2,
    'daemonize' => $daemon,
    'enable_coroutine' => true,
    'hook_flags' => swoole_hook_flags(),
]);
Siam
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
(转载)为什么不推荐使用swoole和hyperf官方框架
(转载)为什么不推荐使用swoole和hyperf官方框架
4726 0
hyperf| hyperf/metric 上手指南
这期又开始聊微服务的基础设施之一: 实时监控. 更准确的说法, 基于 prometheus 的实时监控. 关于技术选型这里就不多啰嗦啦, 很多时候「从众」或者「用脚投票」往往是最有效的
913 0
php xdebug的配置、调试、跟踪、调优、分析
php xdebug的配置、调试、跟踪、调优、分析
MQ产品使用合集之在同一个 Java 进程内建立三个消费对象并设置三个消费者组订阅同一主题和标签的情况下,是否会发生其中一个消费者组无法接收到消息的现象
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
196 1
完美解决 Python library not found: libpython3.10m.dylib, Python3, .Python, lib...
完美解决 Python library not found: libpython3.10m.dylib, Python3, .Python, lib...
283 0
选择阿里云服务器配置教程CPU/内存/带宽/系统盘选择攻
选择阿里云服务器配置教程CPU/内存/带宽/系统盘选择攻
432 0
swoole进程结构
进程结构官方文档:https://wiki.swoole.com/#/learn?id=diff-process
124 0
swoole进程结构
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等