当我的网络应用程序需要额外资源时,我使用DigitalOcean API创建了水滴。由于DigitalOcean的收费方式(最少一小时增量),我希望将创建的服务器保持一小时,以便在初始任务完成后可用于新任务。
我正在考虑以这种方式格式化我的脚本:
<?php
createDroplet($dropletid);
$time = time();
// run resource heavy task
sleep($time + 3599);
deleteDroplet($dropletid);
这是实现这一目标的最佳方法吗?
答案 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脚本,并且您有一个数据库条目,告诉您在特定的开始时间分配哪个资源并在某个到期时间解除分配。然后那个脚本可以为你做一个约一分钟的准确,这应该足够了。即使服务器崩溃并重新启动,只要数据库完好无损且脚本再次运行,一切都应按计划进行。我知道,实施这项工作要远得多,但这是更好的方法。