Важные замечания
Замечания по использованию таймеров
-
Таймеры могут быть добавлены только в обратных вызовах
onXXXX. Рекомендуется устанавливать глобальные таймеры в обратном вызовеonWorkerStart, а таймеры для определенного соединения — вonConnect. -
Добавленные таймеры выполняются в текущем процессе (новые процессы или потоки не запускаются), и тяжелые задачи могут повлиять на выполнение других задач в текущем процессе, поэтому лучше выполнять долгие задачи в отдельном процессе, например, создать один или несколько процессов Worker.
-
Если в текущем процессе не включены协程 swoole/swow, и он занят другими задачами, или если задача не завершилась в ожидаемое время, и начинается следующий цикл, то выполнение следующей задачи будет ждать завершения текущей задачи, что может привести к тому, что таймер не будет выполняться с ожидаемым интервалом. То есть, все бизнес-операции текущего процесса выполняются последовательно, если это многопроцессная структура, то задачи между процессами выполняются параллельно.
-
Следует обратить внимание, что в многопоточном окружении установка таймеров может привести к проблемам с параллелизмом. Например, следующий код будет выводить 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.
-
Может быть ошибка порядка 1 миллисекунды.
-
Таймеры не могут быть удалены между процессами, например, таймер, установленный в процессе a, не может быть напрямую удален с использованием интерфейса Timer::del в процессе b.
-
Идентификаторы таймеров между различными процессами могут повторяться, но идентификаторы таймеров, создаваемые в одном процессе, не будут повторяться.
-
Изменение системного времени повлияет на поведение таймеров, поэтому после изменения системного времени рекомендуется перезапустить систему.