ホームページ >PHPフレームワーク >Swoole >優雅なシャットダウンのために、Swooleアプリケーションの信号を処理するにはどうすればよいですか?
優雅なシャットダウンのためのSwooleアプリケーションのシグナルの取り扱いには、特定の信号を受信したときにアプリケーションが適切に応答できる信号ハンドラーを登録することが含まれます。これがあなたがそれを行う方法です:
登録信号ハンドラー:Swooleは、信号イベントを含むイベントリスナーをon
する方法を提供します。 SigtermやSigintなどの信号を処理するには、次のコードを使用できます。
<code class="php">$server->on('WorkerStop', function ($server, $workerId) { // Cleanup worker resources }); $server->on('Shutdown', function ($server) { // Cleanup server-wide resources }); // For Unix signals swoole_process::signal(SIGTERM, function ($signo) { echo "Received SIGTERM. Shutting down gracefully...\n"; // Perform necessary cleanup swoole_event::exit(); }); swoole_process::signal(SIGINT, function ($signo) { echo "Received SIGINT. Shutting down gracefully...\n"; // Perform necessary cleanup swoole_event::exit(); });</code>
再起動とリロード:Sighupなどの信号の場合、ダウンタイムなしでワーカーを再起動するリロードメカニズムを実装できます。
<code class="php">swoole_process::signal(SIGHUP, function ($signo) { echo "Received SIGHUP. Reloading...\n"; $server->reload(); });</code>
スムーズなアプリケーションのシャットダウンを確実にするには、Swooleで信号ハンドラーを管理するときに、次のベストプラクティスを検討してください。
恵み期間を実装する:進行中のタスクが完了するための恵み期間を許可します。タイマーを使用して、シャットダウン信号を受信した後、実際のシャットダウンを遅らせることができます。
<code class="php">swoole_process::signal(SIGTERM, function ($signo) { echo "Received SIGTERM. Shutting down in 30 seconds...\n"; swoole_timer_after(30000, function() { swoole_event::exit(); }); });</code>
異なる信号に応答するようにSwooleを構成するには、アプリケーションライフサイクルのさまざまな段階の適切な信号ハンドラーのセットアップが含まれます。これがあなたがそれを行う方法です:
起動と初期化:起動時に直接信号を処理できない場合がありますが、将来のイベントに備えるために信号ハンドラーをセットアップできます。
<code class="php">$server = new swoole_http_server("0.0.0.0", 9501); $server->on('Start', function ($server) { echo "Server started. PID: {$server->master_pid}\n"; // Set up signal handlers swoole_process::signal(SIGTERM, function ($signo) use ($server) { echo "SIGTERM received. Shutting down...\n"; $server->shutdown(); }); });</code>
ランニングとリロード:サービスを中断することなく、労働者の優雅なリロードにSighupのような信号を使用します。
<code class="php">swoole_process::signal(SIGHUP, function ($signo) use ($server) { echo "SIGHUP received. Reloading workers...\n"; $server->reload(); });</code>
シャットダウンとクリーンアップ:優雅なシャットダウンのためにSigtermとSigintを処理:
<code class="php">swoole_process::signal(SIGINT, function ($signo) use ($server) { echo "SIGINT received. Shutting down...\n"; $server->shutdown(); });</code>
エラー処理:クラッシュダンプ用のSigseGVなどの予期しない信号用にハンドラーをセットアップすることもできます。
<code class="php">swoole_process::signal(SIGSEGV, function ($signo) { echo "SIGSEGV received. Generating crash dump...\n"; // Generate crash dump here });</code>
スウールでの信号処理のテストは、アプリケーションが優雅にシャットダウンすることを保証するために重要です。次の手順に従って、信号処理をテストおよび検証します。
ユニットテスト信号ハンドラー:単位テストを記述して、信号ハンドラーが予想どおりに動作するようにします。ハンドラーを手動で呼び出すことで、信号領収書をシミュレートできます。
<code class="php">class SignalHandlerTest extends PHPUnit\Framework\TestCase { public function testSigtermHandler() { $handler = function ($signo) { echo "SIGTERM received.\n"; // Assert cleanup actions here }; $handler(SIGTERM); // Assert expected behavior } }</code>
統合テスト:スウールアプリケーションを実行し、コマンドラインツールを使用して信号を送信して実際の動作をテストします。
<code class="bash"># Start Swoole server php your_script.php # Send SIGTERM to the server kill -SIGTERM <pid_of_swoole_server></pid_of_swoole_server></code>
監視ログ:シャットダウンプロセス中にアプリケーションログのすべてのステップを確認します。これらのログを確認して、アプリケーションが正しいクリーンアップ操作を実行していることを確認してください。
<code class="php">swoole_process::signal(SIGTERM, function ($signo) { error_log("SIGTERM received. Starting shutdown process.\n"); // Perform cleanup error_log("Shutdown process completed.\n"); swoole_event::exit(); });</code>
自動テスト:CI/CDパイプラインを使用して、信号処理テストを自動化します。サーバーを起動するスクリプトを設定し、信号を送信し、正しい動作を確認してください。
<code class="yaml">steps: - name: Start Swoole Server run: php your_script.php & - name: Send SIGTERM run: kill -SIGTERM $(pgrep -f "your_script.php") - name: Check Logs run: cat swoole.log | grep "Shutdown process completed"</code>
これらの手順に従うことにより、Swooleで信号処理を包括的にテストして、優雅なシャットダウンプロセスを確保できます。
以上が優雅なシャットダウンのために、Swooleアプリケーションの信号を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。