Я пытаюсь запустить несколько процессов как можно ближе к одному и тому же времени.Cronjob выбирает все элементы для обработки из базы данных за минуту до фактического времени, когда эти процессы должны быть запущены, а затем запускает дочерний процесс для каждой найденной записи.
Поскольку выполнение может занять несколько секундбазы данных и порождения дочерних процессов, я пытаюсь создать задержку сна или ожидания, чтобы каждый порожденный дочерний процесс начинался как можно ближе к вершине следующей минуты.
При тестировании я заметил некоторыеРазличия между дочерним временем запуска, возвращаемым time () и microtime ().
Вот код, который я должен создать для задержки:
$unixtime_now = time();
$unixMicrotime_now = microtime(true);
$timeToStart = $unixtime_now + 2;
$timeToSleep = $timeToStart - $unixMicrotime_now;
$timeToSleep = number_format($timeToSleep,6);
$timeToSleep = str_replace('.','',$timeToSleep);
usleep ($timeToSleep);
$startedAtMicrotimeFloat = microtime(true);
$startedAtTime = time();
$date1 = date("H:i:s", $startedAtMicrotimeFloat);
$date2 = date("H:i:s", $startedAtTime);
echo "Unixtime Now = $unixtime_now<br />UnixMicroTime Now = $unixMicrotime_now<br />Time to Start = $timeToStart<br />Time to Sleep = $timeToSleep<br />Started at Time = $startedAtTime - $date2<br />Started at MicroTimeFloat = $startedAtMicrotimeFloat - $date1";
Обратите внимание, что я использовал 2 секунды, а не 60секунд для смещения для ускорения тестирования.
2 вопроса:
1) Независимо от того, сколько раз я запускаю это, время, возвращаемое функцией time (), всегда ВСЕГДА на 1 секунду раньше временивозвращается через microtime ().Например:
Started at Time = 1555765444 - 09:04:04
Started at MicroTimeFloat = 1555765445.0002 - 09:04:05
Это, вероятно, лес для проблемы с деревьями, но есть ли у кого-нибудь идея, почему это так или как я могу ее решить?
2) Есть ли недостаткичтобы задержка usleep () длилась 59 секунд?Было бы лучше использовать sleep () и принять дочерние процессы, которые могут начинаться с 1555765445.9999 - 09:04:05, а не с 1555765445.0002 - 09:04:05 или почти до полной секунды спустя?
Заранее спасибо.
Алан
По совету Дейва я отредактировал код следующим образом:
$date1 = date("H:i:s", microtime(true));
$date2 = date("H:i:s", time());
Я все еще получаю тот же результат:
Started at Time = 1555876342 - 15:52:22
Started at MicroTimeFloat = 1555876343.0003 - 15:52:23
Результат microtime (), который, как я подозреваю, является точным, позже, чем результат time (), на 1.0003 секунды.