如何设置 PHP 工作线程


How To Setup PHP Workers

我们正在编写一个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 后,服务器是否可以不触发请求?

例如。

  1. PHP 脚本通过您的 API 请求服务器创建新的 VM。
  2. PHP 脚本记录开始时间和退出时间。服务器上队列中的 VM 等待创建。
  3. 服务器最终创建 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;
    }
}