ホームページ >PHPフレームワーク >Swoole >Swooleプロセスを正しく終了する方法

Swooleプロセスを正しく終了する方法

PHPz
PHPzオリジナル
2023-03-27 15:29:061912ブラウズ

Swoole は、PHP アプリケーションのパフォーマンスと同時実行機能を大幅に向上させる、非同期並列 PHP ネットワーク プログラミング フレームワークです。 Swoole を使用してアプリケーションを開発する過程で、Swoole のプロセスを終了しなければならない場面が必ず出てきますが、この記事では Swoole のプロセス管理と Swoole の正しい終了方法について紹介します。

1. Swoole のプロセス管理

Swoole では、Swoole\Process クラスを使用して子プロセスを作成できます。子プロセスが終了すると、親プロセスは適切なタイミングで子プロセスをリサイクルする必要があります。そうしないと、ゾンビ プロセスが表示され、システム リソースが占有され、プログラムのパフォーマンスに悪影響を及ぼします。

Swoole では、次の 2 つの方法でプロセスを終了できます:

1. exit メソッドを呼び出します

Swoole では、exit メソッドを呼び出してプロセスを終了できます。現在のプロセスプロセス。以下は簡単な例です。

$process = new Swoole\Process(function (Swoole\Process $process) {
    echo "Child process start" . PHP_EOL;
    sleep(10);
    echo "Child process end" . PHP_EOL;
    $process->exit(0); // 结束进程
});

$process->start();
swoole_process::wait(); // 回收子进程

子プロセスがすべてのビジネス ロジックを実行した後、exit メソッドが呼び出されてプロセスが終了し、親プロセスは swoole_process::wait() メソッドを呼び出して、子プロセス。

2. kill メソッドを呼び出す

kill メソッドを呼び出して、指定されたプロセスを終了することもできます。以下は例です:

$pid = $process->start();
Process::kill($pid, SIGTERM); // 结束进程

ここで、指定されたプロセスの PIDプロセスが渡される kill メソッドを与えて、指定されたプロセスを終了します。

2. Swoole を正しく終了する方法

Swoole プロセスを正しく終了するには 2 つの問題があります:

1. 終了信号をリッスンする方法

Swoole では、プロセスはデフォルトではシグナルを処理しないため、プロセスのシグナル リスナーを登録する必要があります。

次は Swoole プロセスの例です:

$server = new Swoole\Http\Server("127.0.0.1", 9501);

$server->on("start", function () {
    // 注册信号监听器
    $signalHandler = function ($signal) use ($server) {
        echo "Receive signal $signal" . PHP_EOL;

        // 等待所有Worker进程结束
        $server->shutdown();
    };

    Swoole\Process::signal(SIGTERM, $signalHandler);
    Swoole\Process::signal(SIGINT, $signalHandler);
});

$server->on("workerStart", function () {
    // 设置Work进程的异常处理函数
    set_exception_handler(function (Throwable $exception) {
        echo $exception->getMessage() . PHP_EOL;

        // 退出进程
        exit(1);
    });
});

$server->on("request", function ($request, $response) {
    $response->end("Hello Swoole\n");
});

$server->start();

上記のコードでは、プロセスの 2 つのシグナル SIGTERM と SIGINT のリスナーを登録しました。これらの 2 つのシグナルが受信されると、 $server->shutdown() メソッドが実行され、サーバー プロセスが停止されます。また、各Workerプロセスには、Workerプロセスのコード内で例外が発生した場合、例外情報を出力してプロセスを終了する例外処理機能も設けています。

2. プロセスの終了を待つ方法

登録されたシグナル リスナーを通じて終了シグナルを受信した後、すべてのワーカー プロセスが終了するまで待ってからプロセスを終了する必要があります。ワーカー プロセスはまだ実行状態である可能性があります。

Swoole では、$serv->shutdown() または $serv->stop() メソッドを呼び出して、すべてのワーカー プロセスが終了するのを待つことができます。

$serv->shutdown() と $serv->stop() の違いは次のとおりです。

  • shutdown メソッドは、メイン プロセス内のすべての Worker プロセスを直接終了します。シャットダウン メソッドは、すべてのワーカー プロセスが終了するのを待ってから、サーバー プロセスを終了します。
  • 停止メソッドはワーカー プロセスとネゴシエートしてプロセスを終了します。各ワーカー プロセスはクリーンアップ作業 (タイマーのクリア、すべてのイベントの終了など) を実行して、終了プロセスがクリーンで完了していることを確認します。 。

以下は、シャットダウン メソッドを使用して Swoole プロセスを終了する例です:

$serv = new Swoole\WebSocket\Server("0.0.0.0", 9501);

$serv->on("Start", function () use ($serv) {
    // 注册信号监听器
    $signalHandler = function ($signal) use ($serv) {
        echo "Receive signal $signal" . PHP_EOL;

        // 停止Server
        $serv->shutdown();
    };

    Swoole\Process::signal(SIGTERM, $signalHandler);
    Swoole\Process::signal(SIGINT, $signalHandler);
});

$serv->on("workerStart", function () {
    // 设置Work进程的异常处理函数
    set_exception_handler(function (Throwable $exception) {
        echo $exception->getMessage() . PHP_EOL;

        // 退出进程
        exit(1);
    });
});

$serv->on("message", function ($serv, $frame) {
    $serv->push($frame->fd, "Hello Swoole");
});

$serv->start();

上の例では、サーバーの 2 つのシグナル SIGTERM と SIGINT のリスナーを登録しました。プロセスを終了し、終了シグナルを受信したときに $serv->shutdown() メソッドを呼び出してプロセスを終了します。

概要

Swoole では、プロセスを正しく終了することが非常に重要なトピックです。ゾンビ プロセスやワーカー プロセスがまだ実行されていないように、Swoole プロセスのシグナル リスナーを登録し、すべてのワーカー プロセスが終了するのを待ってからプロセスを終了する必要があります。同時に、例外が発生したときにプロセスが時間内に終了するように、各ワーカー プロセスに例外処理関数を設定する必要もあります。

以上がSwooleプロセスを正しく終了する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。