注意事項

タイマー使用時の注意事項

  1. onXXXX コールバック内でのみタイマーを追加できます。グローバルなタイマーは onWorkerStart コールバック内で設定することを推奨し、特定の接続に対するタイマーは onConnect で設定することを推奨します。

  2. 追加された定期タスクは現在のプロセスで実行され(新しいプロセスまたはスレッドを起動しません)、重いタスクは現在のプロセスが他のタスクを実行するのに影響を与える可能性があるため、時間のかかるタスクは別々のプロセスで実行することをお勧めします。たとえば、1つ以上の Worker プロセスを作成して実行します。

  3. 現在のプロセスが swoole/swow コルーチンを開いていない場合、現在のプロセスが他の業務に忙しい時、またはタスクが予想される時間内に完了していない時に次の実行周期が来た場合、現在のタスクが完了するまで待機するため、タイマーは予想される時間間隔で実行されません。つまり、現在のプロセスの業務はすべて直列に実行されます。複数プロセスの場合は、プロセス間のタスク実行は並列です。

  4. 複数プロセスでタイマーを設定すると競合の問題を引き起こす可能性があります。たとえば、以下のコードは毎秒5回出力されます。

    $worker = new Worker();
    // 5つのプロセス
    $worker->count = 5;
    $worker->onWorkerStart = function(Worker $worker) {
    // 5つのプロセスがあり、それぞれのプロセスにこのようなタイマーがあります
    Timer::add(1, function(){
        echo "hi\r\n";
    });
    };
    Worker::runAll();

    もし1つのプロセスでのみタイマーを実行したい場合は、Timer::add サンプル2を参照してください。

  5. 約1ミリ秒の誤差が生じる可能性があります。

  6. タイマーは異なるプロセス間で削除できません。たとえば、aプロセスで設定されたタイマーはbプロセスで直接Timer::delインターフェースを呼び出して削除することはできません。

  7. 異なるプロセス間のタイマーIDは重複する可能性がありますが、同じプロセス内で生成されたタイマーIDは重複しません。

  8. システム時間を変更するとタイマーの動作に影響を与えるため、システム時間を変更した後は再起動することをお勧めします。