walkor / workerman

An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.
http://www.workerman.net
MIT License
11.03k stars 2.25k forks source link

Fixed bug: onWorkerStop cannot be triggered. #959

Closed twomiao closed 9 months ago

twomiao commented 9 months ago
  1. 修复worker 进程无法触发信号,导致onWorkerStop() 无法执行。

    $signals = [SIGINT, SIGTERM, SIGHUP, SIGTSTP, SIGQUIT, SIGUSR1, SIGUSR2, SIGIOT, SIGIO];
    foreach ($signals as $signal) {
     //   pcntl_signal($signal, SIG_IGN, false); 移除信号屏蔽,重新注册会重写master 信号。
     // Rewrite master process signal.
    static::$globalEvent->onSignal($signal, [static::class, 'signalHandler']);
    }
  2. 修复swoole exit() 发生异常:

    onWorkerStart
    ^CWorkerman[start.php] stopping ...
    onWorkerStop
    PHP Fatal error:  Uncaught Swoole\ExitException: swoole exit in /mnt/c/users/twomiao/desktop/workerman/src/Worker.php:1921
    Stack trace:
    #0 /mnt/c/users/twomiao/desktop/workerman/src/Worker.php(1192): Workerman\Worker::stopAll()
    #1 [internal function]: Workerman\Worker::signalHandler()
    #2 {main}
    thrown in /mnt/c/users/twomiao/desktop/workerman/src/Worker.php on line 1921
    worker[none:2878] exit with status 65280
    Workerman[start.php] has been stopped

    try { // Ignore Swoole ExitException: Swoole exit. exit($code); } catch(\Exception $e) { }

  3. 复现代码:

    
    <?php

use Workerman\Events\Swoole; use Workerman\Worker;

require DIR . "/vendor/autoload.php";

Worker::$eventLoopClass = Swoole::class; Worker::$stopTimeout = 15; $worker = new Worker("http://0.0.0.0:8888"); $worker->count = 1; $worker->onMessage = static fn ($connection) => $connection->send("hello world");

$worker->onWorkerStart = static fn (Worker $worker) => print "onWorkerStart\n"; $worker->onWorkerStop = static fn (Worker $worker) => print "onWorkerStop\n"; Worker::runAll();

walkor commented 9 months ago

Thanks