我们正在编写一个PHP脚本,该脚本通过RESTful API调用创建虚拟机。这部分很容易。将创建 VM 的请求发送到服务器后,API 请求基本上返回"计算机排队等待创建..."。当我们创建一个虚拟机时,我们将一条记录插入到MySQL数据库中,基本上带有VM标签和DATE-CREATED-START。该记录还有一个字段 日期创建-完成 为空。
LABEL DATE-CREATED-STARTED DATE-CREATED-FINISHED
test-vm-1 2011-05-14 12:00:00 NULL
这就是我们的问题。我们基本上如何在初始请求上衍生/生成一个 PHP worker ,它每 10 秒检查一次排队虚拟机的状态,当虚拟机启动并运行时,更新创建日期完成。请记住,初始 API 请求会立即返回"要创建的计算机队列",然后退出。PHP worker 需要在后台执行 10 秒的检查。
创建 VM 后,服务器是否可以不触发请求?
例如。
- PHP 脚本通过您的 API 请求服务器创建新的 VM。
- PHP 脚本记录开始时间和退出时间。服务器上队列中的 VM 等待创建。
- 服务器最终创建 VM 并调用更新表 php 脚本。
这样你就没有轮询,没有cron脚本,没有后台线程等。但前提是你的系统可以这样工作。否则,我会考虑设置@dqhendricks提到的 cron 脚本,或者如果可能的话,设置一个 Alp 提到的背景脚本@Savas。
如果您的主机允许,请创建一个 PHP CLI 程序并在后台执行它,如下所示。
<?php
while (true)
{
sleep(10);
// Do the checks etc.
}
?>
并像以下命令一样运行它:
php background.php & // Assuming you're using Linux
如果您的主机不允许运行后台作业,则必须利用一切机会进行此检查;就像在每个PHP页面请求开始时执行此操作一样。为了帮助实现此目的,在创建虚拟机后,生成的页面可能会每 10 秒刷新一次!
作为变体,您可以使用任务模块,并且有任务代码的示例:
class VMCheck extends 'Tasks'Task
{
protected $vm_name;
public function add($vm_name)
{
$this->getStorage()->store(__CLASS__, $vm_name, true);
}
public function execute()
{
do
{
$check = CheckAPI_call($vm_name); //your checking code here
sleep(10);
}
while (empty($check));
}
public function restore($data)
{
$this->vm_name = $data;
}
}