国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

webman event_loop 使用了swoole,無法平滑重啟或者平滑關(guān)閉

speedy

問題描述

webman 框架
event_loop 使用了swoole
無法平滑重啟或者平滑關(guān)閉

程序代碼或配置

php start.php stop -g
Workerman[start.php] stop 
Workerman[start.php] is gracefully stopping ...
config/server:
'event_loop' => \Workerman\Events\Swoole::class,
app/bootstrap:
Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]);

在控制器中使用了協(xié)程代碼后,使用平滑重啟或者關(guān)閉-g參數(shù),命令行就會一直等待,請求也進不來

代碼:
go(function(){
    sleep(20);
    echo "xxx";
});

操作系統(tǒng)環(huán)境及workerman/webman等具體版本

ubuntu 22
php 8.3.13
Webman-framework v1.5.2

930 1 1
1個回答

walkor 打賞

本地測試了下,沒發(fā)現(xiàn)問題
workerman/webman-framework 1.5.24
workerman/workerman 4.1.16

  • speedy 2024-11-07

    感謝大佬回答,可能是我描述的還不夠清除。我又重新安裝了一遍,確實存在無法平滑關(guān)閉/重啟問題。
    步驟如下:
    1.使用 composer 安裝 webman
    2.修改 config/server.php 中的event_loop為 \Workerman\Events\Swoole::class
    3.新建 app/bootstrap/SwooleConfig.php
    4.在 SwooleConfig.php 文件中加入 Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]); 開啟協(xié)程
    5.在 IndexController.php

    加入?yún)f(xié)程代碼
        go(function () {
        sleep(5);
        echo 123;
        });
    1. 使用一個終端執(zhí)行 php start.php start

    2. 使用瀏覽器訪問index,看到控制臺正確異步輸出 “123”

    3. 使用一個新的終端執(zhí)行 php start.php stop -g 關(guān)閉平滑關(guān)閉

      php start.php stop -g
      Workerman[start.php] stop 
      Workerman[start.php] is gracefully stopping ...
      無響應(yīng),持續(xù)等待
    4. 如果不用瀏覽器訪問index,沒有執(zhí)行過異步代碼,是可以正常平滑關(guān)閉的,一旦訪問了協(xié)程代碼,就無法平滑關(guān)閉。

    5. 使用新終端執(zhí)行 php start.php stop 不加入 -g 參數(shù),如果協(xié)程暫未運行結(jié)束,j舊的啟動終端就會提示:

      [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
      [Coroutine-9]
      #0 /app_project/webman/app/controller/IndexController.php(12): sleep()
      #1 [internal function]: app\controller\IndexController->app\controller\{closure}()

    11.使用新終端執(zhí)行 php start.php stop 不加入 -g 參數(shù),如果協(xié)程結(jié)束了,則是正常關(guān)閉

    抱歉大佬,刪了又改幾次回復(fù),就是想排版清楚一些,方便大佬查看

  • speedy 2024-11-07

    補充在第4到第5步中還有一步:

    在config/bootstrap.php,新增初始化類
    return [
        support\bootstrap\Session::class,
        support\bootstrap\LaravelDb::class,
        app\bootstrap\SwooleConfig::class, //新增
    ];
  • walkor 2024-11-07

    初步測試判斷是swoole的bug,swoole文檔說調(diào)用 Swoole\Event::del() 后事件回調(diào)函數(shù)會釋放,但是實際沒有釋放,導(dǎo)致連接對象一直沒釋放。
    workerman后面會發(fā)版本會兼容這個問題。

  • speedy 2024-11-07

    好的,感謝大佬回答!
    因為我的 webman 項目已經(jīng)在運行了,后續(xù)可以使用此命令跟新嗎?
    composer update workerman/webman-framework

  • walkor 2024-11-07

    要更新workerman

    composer require workerman/workerman
    這邊盡快出個版本兼容下

  • speedy 2024-11-07

    非常感謝大佬!

  • walkor 2024-11-07

    好了, composer require workerman/workerman 試下

  • speedy 2024-11-07

    感謝大佬,剛剛測試了,發(fā)現(xiàn)2個疑問:

    1. 使用了 php start.php stop -g 會立刻執(zhí)行協(xié)程代碼。
    go(function(){
            sleep(10);
            echo "xxx";   //使用了stop -g 會立刻輸出,并未按上面的sleep 10秒后執(zhí)行
     });
    1. 執(zhí)行業(yè)務(wù)代碼報錯
    go(function(){
                sleep(10);
                echo "xxx";
    
                $filePath = runtime_path() . DIRECTORY_SEPARATOR . date("Ymd") . "debug.log";
                $folderPath = dirname($filePath);
                if (!is_dir($folderPath)) {
                    mkdir($folderPath, 0755, true); 
                }
                file_put_contents($filePath,"test", FILE_APPEND);
    });

    報錯內(nèi)容:

    使用了stop -g 會立刻輸出,并未的sleep 10秒后執(zhí)行,并且業(yè)務(wù)代碼出錯
    
    xxx
     [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
     [Coroutine-8]
    --------------------------------------------------------------------
    #0 /app_project/ffbox2/app/service/UserService.php(26): is_dir()
    #1 [internal function]: app\service\UserService->app\service\{closure}()
  • walkor 2024-11-07

    sleep()會被信號打斷,會立刻返回。
    stop -g原理是判斷連接數(shù)是否為0,為0則認為可以安全關(guān)閉,并不會判斷是否有swoole協(xié)程在運行。
    deadlock 這個目前不好解決,你可以在 vendor/workerman/workerman/Events/Swoole.php 的 destroy() 方法
    加一句slee(1);給協(xié)程退出一點時間試下

    sleep(1);
    Event::exit();
  • speedy 2024-11-07

    非常感謝大佬,加入了sleep(1),測試十分有效,我添加了一千個協(xié)程,都可以安全退出和重啟;
    大佬這個小改動會更新到compose中嗎?

  • walkor 2024-11-07

??