#php #time
#php #время
Вопрос:
Я пытаюсь запустить несколько процессов как можно ближе к одному и тому же времени. Cronjob выбирает все элементы для обработки из базы данных за минуту до фактического времени, необходимого для запуска этих процессов, а затем запускает дочерний процесс для каждой найденной записи.
Поскольку для запуска базы данных и запуска дочерних процессов может потребоваться несколько секунд, я пытаюсь создать задержку сна или usleep, чтобы каждый порожденный дочерний процесс запускался как можно ближе к началу следующей минуты.
При тестировании я заметил некоторые различия между временем запуска дочерних элементов, возвращаемым 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 секунды.
Комментарии:
1. Что вы получите, если переместите извлечение времени в присваивания переменных для
$date1
и$date2
? Простой вызовtime
, иmicrotime(true)
я не смог воспроизвести разницу между ними на уровне секунд. Вероятно, также стоит спросить, какую версию PHP вы используете. И есть ли причина, по которой вы пытаетесь запустить что-то в одно и то же время или в начале минуты?2. Я попробую ваше предложение, когда снова окажусь рядом с компьютером… может пройти несколько дней. Это процесс автоматизации того, что ранее было ручным процессом. Я хочу предоставить каждому из моих подписчиков равные шансы на получение одного из ограниченного количества билетов при открытии окна билета
3. Дэйв… см. Выше
4. Какая версия PHP на какой платформе? Как я уже сказал, я не смог воспроизвести то, что вы видите.
5. CentOS Linux 7.6.1810 и PHP 7.2.17. Могу ли я спросить, получаете ли вы одинаковый результат как для time, так и для microtime? Спасибо