diff --git a/.github/workflows/coding-style.yml b/.github/workflows/coding-style.yml index 16459d6..c94377b 100644 --- a/.github/workflows/coding-style.yml +++ b/.github/workflows/coding-style.yml @@ -12,7 +12,7 @@ jobs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check - uses: fkirc/skip-duplicate-actions@v4 + uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: same_content_newer skip_after_successful_duplicate: true @@ -26,14 +26,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup PHP uses: sunxyw/workflows/setup-environment@main with: - php-version: 8.0 + php-version: 8.3 php-extensions: swoole, posix, json operating-system: ubuntu-latest use-cache: true diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 92feeae..beb6bfb 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -12,7 +12,7 @@ jobs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check - uses: fkirc/skip-duplicate-actions@v4 + uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: same_content_newer skip_after_successful_duplicate: true @@ -26,14 +26,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup PHP uses: sunxyw/workflows/setup-environment@main with: - php-version: 7.4 + php-version: 8.3 php-extensions: swoole, posix, json operating-system: ubuntu-latest use-cache: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 647e4ef..21ecac7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check - uses: fkirc/skip-duplicate-actions@v4 + uses: fkirc/skip-duplicate-actions@v5 with: concurrent_skipping: same_content_newer skip_after_successful_duplicate: true @@ -34,12 +34,12 @@ jobs: strategy: matrix: operating-system: [ ubuntu-latest, windows-latest, macos-latest ] - php-version: [ 7.4, 8.0, 8.1 ] + php-version: [ 8.1, 8.2, 8.3, 8.4 ] name: PHP ${{ matrix.php-version }} Test (${{ matrix.operating-system }}) runs-on: ${{ matrix.operating-system }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/composer.json b/composer.json index 30dc27d..e959306 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "wiki": "https://github.com/botuniverse/php-libonebot/wiki" }, "require": { - "php": "^7.4 || ^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4", + "php": "^7.4 || ^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4 || ^8.5", "ext-json": "*", "psr/cache": "^1.0 || ^3.0", "psr/event-dispatcher": "^1.0", @@ -38,11 +38,11 @@ }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.8", - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^1.1", - "phpunit/phpunit": "^9.0 || ^8.0", - "swoole/ide-helper": "~4.4.0", - "symfony/var-dumper": "^5.3" + "friendsofphp/php-cs-fixer": "^3.64", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^9.0", + "swoole/ide-helper": "~5.0", + "symfony/var-dumper": "^5.3 || ^6.0 || ^7.0" }, "suggest": { "nunomaduro/collision": "Better display for exception and error message", diff --git a/src/OneBot/Driver/Workerman/Worker.php b/src/OneBot/Driver/Workerman/Worker.php index 09a5db9..f46f2f1 100644 --- a/src/OneBot/Driver/Workerman/Worker.php +++ b/src/OneBot/Driver/Workerman/Worker.php @@ -7,6 +7,7 @@ namespace OneBot\Driver\Workerman; use Workerman\Connection\ConnectionInterface; +use Workerman\Events\EventInterface; use Workerman\Lib\Timer; /** @@ -51,7 +52,7 @@ public static function runAll(): void static::parseCommand(); // 解析命令行,但好像 libob 不太需要 static::daemonize(); // 创建守护进程,但 libob 好像也不太需要 static::initWorkers(); // 初始化 Worker 进程 - // static::installSignal(); // 安装信号处理函数 + static::installSignal(); // 安装信号处理函数 // static::saveMasterPid(); // 保存 Master PID if (static::$_OS === OS_TYPE_LINUX) { // 此处替代上方的 saveMasterPid() 功能 static::$_masterPid = posix_getpid(); @@ -382,24 +383,23 @@ protected static function installSignal() if (static::$_OS === OS_TYPE_WINDOWS) { return; } - echo "设置监听器\n"; $signalHandler = '\Workerman\Worker::signalHandler'; - // // stop - // \pcntl_signal(\SIGINT, $signalHandler, false); - // // stop - // pcntl_signal(SIGTERM, $signalHandler, false); - // // graceful stop - // \pcntl_signal(\SIGHUP, $signalHandler, false); - // // reload + // stop (Ctrl+C) + \pcntl_signal(\SIGINT, $signalHandler, false); + // stop + \pcntl_signal(SIGTERM, $signalHandler, false); + // graceful stop (terminal closed / SIGHUP) + \pcntl_signal(\SIGHUP, $signalHandler, false); + // reload \pcntl_signal(SIGUSR1, $signalHandler, false); - // // graceful reload - // \pcntl_signal(\SIGQUIT, $signalHandler, false); - // // status - // \pcntl_signal(\SIGUSR2, $signalHandler, false); - // // connection status - // \pcntl_signal(\SIGIO, $signalHandler, false); - // // ignore - // \pcntl_signal(\SIGPIPE, \SIG_IGN, false); + // graceful reload + \pcntl_signal(\SIGQUIT, $signalHandler, false); + // status + \pcntl_signal(\SIGUSR2, $signalHandler, false); + // connection status + \pcntl_signal(\SIGIO, $signalHandler, false); + // ignore SIGPIPE (prevent crash on broken pipe) + \pcntl_signal(\SIGPIPE, \SIG_IGN, false); } /** @@ -413,32 +413,21 @@ protected static function reinstallSignal() return; } $signalHandler = '\Workerman\Worker::signalHandler'; - // // uninstall stop signal handler - // \pcntl_signal(\SIGINT, \SIG_IGN, false); - // // uninstall stop signal handler - // pcntl_signal(SIGTERM, SIG_IGN, false); - // // uninstall graceful stop signal handler - // \pcntl_signal(\SIGHUP, \SIG_IGN, false); - // // uninstall reload signal handler - // pcntl_signal(SIGUSR1, SIG_IGN, false); - // // uninstall graceful reload signal handler - // \pcntl_signal(\SIGQUIT, \SIG_IGN, false); - // // uninstall status signal handler - // \pcntl_signal(\SIGUSR2, \SIG_IGN, false); - // // uninstall connections status signal handler - // \pcntl_signal(\SIGIO, \SIG_IGN, false); - // // reinstall stop signal handler - // static::$globalEvent->add(\SIGINT, EventInterface::EV_SIGNAL, $signalHandler); - // // reinstall graceful stop signal handler - // static::$globalEvent->add(\SIGHUP, EventInterface::EV_SIGNAL, $signalHandler); - // // reinstall reload signal handler - // static::$globalEvent->add(SIGUSR1, EventInterface::EV_SIGNAL, $signalHandler); - // // reinstall graceful reload signal handler - // static::$globalEvent->add(\SIGQUIT, EventInterface::EV_SIGNAL, $signalHandler); - // // reinstall status signal handler - // static::$globalEvent->add(\SIGUSR2, EventInterface::EV_SIGNAL, $signalHandler); - // // reinstall connection status signal handler - // static::$globalEvent->add(\SIGIO, EventInterface::EV_SIGNAL, $signalHandler); + // uninstall old pcntl handlers first + \pcntl_signal(\SIGINT, \SIG_IGN, false); + \pcntl_signal(SIGTERM, \SIG_IGN, false); + \pcntl_signal(\SIGHUP, \SIG_IGN, false); + \pcntl_signal(SIGUSR1, \SIG_IGN, false); + \pcntl_signal(\SIGQUIT, \SIG_IGN, false); + \pcntl_signal(\SIGUSR2, \SIG_IGN, false); + \pcntl_signal(\SIGIO, \SIG_IGN, false); + // reinstall via event loop (supports all available event backends: Select, Event, Ev, etc.) + static::$globalEvent->add(\SIGINT, EventInterface::EV_SIGNAL, $signalHandler); + static::$globalEvent->add(\SIGHUP, EventInterface::EV_SIGNAL, $signalHandler); + static::$globalEvent->add(SIGUSR1, EventInterface::EV_SIGNAL, $signalHandler); + static::$globalEvent->add(\SIGQUIT, EventInterface::EV_SIGNAL, $signalHandler); + static::$globalEvent->add(\SIGUSR2, EventInterface::EV_SIGNAL, $signalHandler); + static::$globalEvent->add(\SIGIO, EventInterface::EV_SIGNAL, $signalHandler); } /**