我应该避免一小时睡眠()吗?

时间:2016-06-26 22:18:10

标签: php

当我的网络应用程序需要额外资源时,我使用DigitalOcean API创建了水滴。由于DigitalOcean的收费方式(最少一小时增量),我希望将创建的服务器保持一小时,以便在初始任务完成后可用于新任务。

我正在考虑以这种方式格式化我的脚本:

<?php
createDroplet($dropletid);
$time = time();
// run resource heavy task
sleep($time + 3599);
deleteDroplet($dropletid);

这是实现这一目标的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

这看起来不是一个好主意,但代码很简单,没有什么可以与之竞争。您需要确保您的脚本至少可以运行很长时间。

请注意,sleep()不应将$time作为参数。它睡了给定的秒数。 $time包含许多秒钟。

我担心脚本可能会被中断,您永远不会删除Droplet。考虑到这个脚本,你无能为力。

此外,sleep()本身可能会被打断,导致它比您想要的睡眠时间短得多。更好的睡眠是:

$remainingTime = 3590;
do {
  $remainingTime = sleep($remainingTime);
} while ($remainingTime > 0); 

这将捕获sleep()的中断。这是假设FALSE-1。请参阅sleep()上的手册:http://php.net/manual/en/function.sleep.php

然后问题是你想要准确地睡3599秒,所以你只需要一个小时。我不会这么接近一个小时。您必须留出一些时间让DigitalOcean执行操作并记录时间。我会以3590秒开始,并确保始终有效。

最后:有哪些替代方案?显然,这可能是一项任务。那会怎么样?假设您每分钟执行一次PHP脚本,并且您有一个数据库条目,告诉您在特定的开始时间分配哪个资源并在某个到期时间解除分配。然后那个脚本可以为你做一个约一分钟的准确,这应该足够了。即使服务器崩溃并重新启动,只要数据库完好无损且脚本再次运行,一切都应按计划进行。我知道,实施这项工作要远得多,但这是更好的方法。