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(),
]);
目录
相关文章
|
12月前
|
监控 网络协议 Unix
Supervisor的简单使用
Supervisor的简单使用
79 0
Supervisor的简单使用
|
11月前
|
C# Python
[√]lua 协程
[√]lua 协程
60 1
|
2月前
|
JavaScript
Electron——如何使用nodejs工作线程
Electron——如何使用nodejs工作线程
38 4
|
4月前
|
PHP 调度 容器
Swoole 源码分析之 Coroutine 协程模块
协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或恢复执行。
69 1
Swoole 源码分析之 Coroutine 协程模块
|
5月前
|
SQL 安全 数据库连接
【Qt运行流程详解】从启动到事件循环的深入解读
【Qt运行流程详解】从启动到事件循环的深入解读
374 3
|
网络协议 关系型数据库 MySQL
swoole协程框架?
Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。
89 0
|
网络协议 PHP
Swoole 中通过 process 模块实现多进程
Swoole 中通过 process 模块实现多进程
197 0
Swoole 中通过 process 模块实现多进程
多进程启动appium服务
多进程启动appium服务
99 0
多进程启动appium服务
|
网络协议 前端开发 NoSQL
workerman的基本用法(二)
workerman的基本用法(二)
257 0
workerman的基本用法(二)
|
消息中间件 Java 调度
协程是如何启动的?
协程是如何启动的?
协程是如何启动的?