改进定期查询SQLite数据库的代码

时间:2015-05-07 09:05:32

标签: php sqlite

我有一个sqlite数据库,我定期从PHP查询。查询始终相同,它返回一个字符串。一旦字符串在数据库中发生变化,循环就会结束。

以下代码正常运行,但我很确定这不是执行此操作的最佳方式...

class MyDB extends SQLite3
{
    function __construct()
    {
        $this->open('db.sqlite');
    }
}

$loop = True;
while ($loop == True) {
    sleep(10);
    $db = new MyDB();
    if (!$db) {
        echo $db->lastErrorMsg();
    } else {
        echo "Opened database successfully\n";
    }
    $sql = 'SELECT status from t_jobs WHERE name=' . $file_name;

    $ret = $db->query($sql);
    $state = $ret->fetchArray(SQLITE3_ASSOC);
    $output = (string)$state['status'];
    if (strcmp($output, 'FINISHED') == 0) {
        $loop = False;
    }
    echo $output;
    $db->close();
}

1 个答案:

答案 0 :(得分:2)

如果你想立即得到一个输出和一种接口,我认为你的问题的最佳解决方案可能是使用HTTP长轮询。这样,如果没有完成工作,它将不会持续数小时:

  • 你需要编写一个javascript代码段(在另一个html或php页面中),它运行对当前php代码的ajax调用。
  • 您的网络服务器(以及您的php代码)将保持连接打开一段时间,直到作业完成或达到时间限制(比如20-30秒)
  • 如果作业没有完成,javascript将进行另一个ajax调用,一切都将重新开始,保持连接等等......直到你得到预期的输出状态......

请注意:此解决方案不适用于任何托管服务提供商

为此,您需要将max_execution_time设置为高于默认值php doc

我认为你可以在google / stack overflow上使用php / javascript在http长轮询中找到很多东西......