我正在尝试尽可能接近同一时间启动多个进程。 cronjob会在需要实际启动这些进程的实际时间之前一分钟从数据库中选择所有要处理的项目,然后为找到的每个记录启动一个子进程。
由于运行数据库并生成子进程可能要花费几秒钟,因此,我尝试创建睡眠或usleep延迟,以便每个生成的子进程都尽可能在下一分钟的顶部开始。 / p>
在测试中,我注意到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()返回的时间总是比microtime()返回的时间早1秒。例如:
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,或者直到大约一秒钟之后才开始?
谢谢。
艾伦
根据Dave的建议,我对代码进行了如下编辑:
$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秒。