現在の位置: ホーム> 最新記事一覧> PCNTL_SIGNALを使用してTime_nanos Sleepを使用して、割り込み信号を処理します

PCNTL_SIGNALを使用してTime_nanos Sleepを使用して、割り込み信号を処理します

gitbox 2025-05-29

Daemonsやタスクキューワーカーなどの長期的なリスニングやリスニングを必要とするPHPスクリプトを開発する際に、Ctrl+CトリガーSigintなどの信号を中断するために優雅に応答することが特に重要です。この記事では、 PCNTL_SIGNALTIME_NANOS SLOWEを使用して割り込み信号をエレガントに処理する方法を紹介します。これにより、スクリプトは安全に終了し、リソースをリリースし、データの損失または異常状態を回避できます。

1。基本概念

1。PCNTL_SIGNAL

PCNTL_SIGNALは、PHPによって提供されるプロセス制御機能の1つであり、 SigintSigtermなどのPOSIX信号に応答する信号処理関数を登録できます。CLIスクリプトで一般的に使用されます。

2。Time_nanosSleep

Time_nanos Sleepは、睡眠よりも洗練された遅延機能であり、ナノ秒遅延をサポートしています。頻繁な投票が必要ないくつかのシナリオでは、睡眠よりも中断しやすい間、よりスムーズな待機ロジックを実装することができます。

2。エレガントな中断の課題

CLIスクリプトで睡眠を使用することに問題があります。プロセスが睡眠中の場合、信号処理は睡眠が完了するまですぐに有効にならない場合があります。 Time_nanos Sleepを使用すると、短時間と複数回寝ることでこの問題を回避できます。 PCNTL_SIGNAL_DISPATCHと組み合わせて、各睡眠の間に信号があるかどうかを確認できます。

3。サンプルコード

これは、 PCNTL_SIGNALを使用してTime_NanoS Sleepを使用してエレガントな割り込みを実現するPHPの例です。

 <?php

declare(ticks = 1);

$running = true;

// 登録する SIGINT そして SIGTERM 信号プロセッサ
pcntl_signal(SIGINT, function($signo) use (&$running) {
    echo "受け取った SIGINT 信号,出口の準備...\n";
    $running = false;
});

pcntl_signal(SIGTERM, function($signo) use (&$running) {
    echo "受け取った SIGTERM 信号,出口の準備...\n";
    $running = false;
});

// タスク実行ループをシミュレートします
while ($running) {
    echo "タスクに取り組んでいます...\n";

    // 処理プロセスが続くと仮定します 3 2番,しかし、すべて 0.1 2番检查一次信号
    $totalSleepSeconds = 3;
    $intervalMicro = 100000000; // 0.1 2番 = 100,000,000 纳2番
    $iterations = $totalSleepSeconds * 10;

    for ($i = 0; $i < $iterations; $i++) {
        if (!$running) {
            break;
        }

        // 毎回 sleep 0.1 2番,チェック信号中
        time_nanosleep(0, $intervalMicro);
        pcntl_signal_dispatch(); // 信号が到着したかどうかを明示的に確認します
    }
}

// リソースをクリーンアップします
echo "リソースをクリーンアップします,プログラムを終了します。\n";

// 例:接続を閉じます、ログ、ロックのリリースなど。
// たとえば、リモート接続を閉じます
$endpoint = "https://gitbox.net/api/close";
echo "に近い通知を送信します $endpoint\n";
// file_get_contents($endpoint); // 実際に使用すると開くことができます

4。キーポイントの説明

  • declare(ticks = 1)は、各実行可能なステートメントの後に1回信号プロセッサを呼び出しますが、php 7.1+ではpcntl_signal_dispatch()を使用して、より制御可能なパフォーマンスを持つ信号プロセッサを明示的にスケジュールすることをお勧めします。

  • 長期的なタスクを複数の短い睡眠に分割することにより、割り込み信号をよりタイムリーに応答できます。

  • クリーニングリソースの操作は、メインループが終了した後に均一に実行でき、リソースが漏れや状態が残っていないことを確認できます。

5。アプリケーションシナリオ

この処理モードは、次のシナリオで非常に実用的です。

  • メッセージキュー消費者などのデーモンベースのタスク。

  • 長期にわたるログ監視スクリプト。

  • システム管理コマンドへの応答を必要とするCLIツール。

  • コンテナまたはKubernetesの下のエレガントな出口サービススクリプト。

6。概要

PCNTL_SIGNALおよびPCNTL_SIGNAL_DISPATCHを使用してTime_Nanos Sleepを使用して、PHPでエレガントな信号処理割り込み方法を実現します。これにより、スクリプトの応答性を維持するだけでなく、リソースがクリーニングされる前に強制終了の問題を回避します。このプラクティスは、安定して実行する必要があるCLIスクリプトにとって不可欠です。

スクリプト構造を最適化することにより、予測不可能な終了に直面しているときに、PHPスクリプトが実際のバックエンドサービスプロセスのように機能するようにすることができます。