我正在尝试按循环的升序计算确切的循环时间。
这是我尝试过的......
$tasks = array(
array(
'halt' => 5,
'task' => 'first'
),
array(
'halt' => 10,
'task' => 'second'
),
array(
'halt' => 15,
'task' => 'third'
),
);
$halt_time = 0;
foreach($tasks as $task){
$halt_time = $halt_time > 0 ? $task['halt'] - $halt_time : $halt_time + $task['halt'];
if ($halt_time > 0) sleep($halt_time);
}
这样可行,它会根据正确的时间运行循环,但是当停止时间相同时会失败,例如,对于后面的数组,它将无法正常运行...
$tasks = array(
array(
'halt' => 5,
'task' => 'first'
),
array(
'halt' => 5,
'task' => 'second'
),
array(
'halt' => 5,
'task' => 'third'
),
);
在这种情况下,它应该只在第一个任务之前等待5秒,然后运行每个任务。
我想解释一下 - 如果它在前一个任务中已经睡了5秒钟,它应该在第二个任务中睡15秒,所以 - sleep(5)
用于第一个任务,sleep(10)
用于第二个任务
我在计算公式中缺少什么。请建议。感谢
答案 0 :(得分:1)
如果您只计算等待的秒数,然后再检查此值,该怎么办?简短但未经测试的代码。
$halt_time = 0;
$total_wait_time = 0;
foreach ($tasks as $task) {
print_r(sprintf("starting %6s task at %s", $task['task'], date("H:i:s")));
$halt_time = $task['halt'];
if ($total_wait_time <= $halt_time) {
$halt_time = $halt_time - $total_wait_time;
}
if ($halt_time > 0 || $total_wait_time === 0) {
sleep($halt_time);
$total_wait_time += $halt_time;
}
print_r(sprintf(", finished at %s\n", date("H:i:s")));
}
对于第一个数组,输出为:
starting first task at 19:29:28, finished at 19:29:33
starting second task at 19:29:33, finished at 19:29:38
starting third task at 19:29:38, finished at 19:29:43
对于第二个:
starting first task at 19:30:58, finished at 19:31:03
starting second task at 19:31:03, finished at 19:31:03
starting third task at 19:31:03, finished at 19:31:03
希望这就是你所需要的,如果不是,我误解了你的问题。
答案 1 :(得分:0)
所有代码均未经过测试。 ; - /
这是'halt'($delayHalt
)值的两个单独用法:
1)它可以是'等待的总累积时间',即它是否大于到目前为止的总执行时间($delayTotal
),然后延迟,使得到目前为止的总数是{{1}时间。
2)可以延迟这项任务。
我们如何识别它们?
到目前为止,我们一直在延迟运行($ delayTotal)
我们检查'当前暂停($delayHalt
)值:
如果它大于$delayHalt
那么:
$delayTotal
; 否则我们将其视为延迟睡眠:
$delaySleep = - $delayHalt - $delayTotal
我们始终将$delaySleep = $delayHalt
添加到$delaySleep
。
然后我们睡觉($ delaySleep);
它应该做必要的事情。
示例代码:
$delayTotal