PHP脚本执行一定次数的命令

时间:2011-11-02 23:58:22

标签: php

我正在尝试编写一个PHP脚本,允许用户选择时间间隔和运行任务的迭代次数。我宁愿不要让PHP脚本一直打开。我正在运行Ubuntu,所以我看了Cron并想出了如何从PHP开始工作,但我不确定如何在运行所需的时间后停止它。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的cron只会为这些请求读取数据库驱动的队列。

假设用户选择了一个任务并在午夜说,运行3次,你的php脚本会将该请求插入队列中供cron检查 - 比如每分钟。您可以将每个迭代作为单独的队列项插入,或者将迭代作为DB中的列...

------------------------------------------
| id | task | datetime | intval | status |
------------------------------------------

并说出一行如下:

-------------------------------------------------
| 1  | foo  | 2011-11-03 00:00:00 | 3 | pending |
-------------------------------------------------

您的cron每分钟都会在数据库中搜索状态为“待定”的任务,并且还安排在此日期时间,然后循环搜索结果并执行类似的操作......

foreach($result AS $task)
{
    for($i = 0; $i < $task->intval; $i ++)
    {
        $task->task();
    }
    mysql_query("UPDATE `table` SET `status` = 'complete' WHERE `id` = ".$task->id);
    // obviously put real mysql syntax here. I'm used to frameworks 
    // and forget the right raw way to do it
}

这也假设任务是一个已定义的函数。如果没有,那么你填写空白,因为我们不确切知道你在做什么。

<强> SO 为了在下面的注释中实现您想要的内容,您可以在插入数据库后立即调用cron脚本 - 如果您有大量用户群或者希望填充队列,那么您将添加一个相当漂亮的方法很大程度上强制项目到cron的前面或完全绕过队列。

这里的一般想法是,在这种情况下,您的选项非常庞大,由您决定如何处理请求和数据。例如,您可以存储用户参数的序列化数组...

array('duration' => 5, 'loop' => 3, 'start' => '2011-11-03 00:00:00')

然后让你的cron使用这个数组的内容来决定如何推送请求。您也不需要将其限制为一个cron。你可以拥有一个几乎连续运行的 - 就像每10秒一样 - 只是抓住下一个请求并完成它。

所以从我这里得到的答案是模糊的,因为我肯定会用crons来做这件事。不要让脚本在客户端运行,因为这可能非常糟糕。 但是cron的工作就像所有PHP一样。您可能需要shell访问权限来设置一个,但最后它只是一个服务器任务,每隔x秒或在特定时间定期调用服务器上的脚本。