Важные замечания

Замечания по использованию таймеров

  1. Таймеры могут быть добавлены только в обратных вызовах onXXXX. Рекомендуется устанавливать глобальные таймеры в обратном вызове onWorkerStart, а таймеры для определенного соединения — в onConnect.

  2. Добавленные таймеры выполняются в текущем процессе (новые процессы или потоки не запускаются), и тяжелые задачи могут повлиять на выполнение других задач в текущем процессе, поэтому лучше выполнять долгие задачи в отдельном процессе, например, создать один или несколько процессов 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();

    Если нужно, чтобы только один процесс выполнял таймер, смотрите Timer::add пример 2.

  5. Может быть ошибка порядка 1 миллисекунды.

  6. Таймеры не могут быть удалены между процессами, например, таймер, установленный в процессе a, не может быть напрямую удален с использованием интерфейса Timer::del в процессе b.

  7. Идентификаторы таймеров между различными процессами могут повторяться, но идентификаторы таймеров, создаваемые в одном процессе, не будут повторяться.

  8. Изменение системного времени повлияет на поведение таймеров, поэтому после изменения системного времени рекомендуется перезапустить систему.