动态安排PHP脚本执行

时间:2012-09-24 11:23:26

标签: php cron

我认为Cron可能是最好的答案,但这项任务似乎令人生畏,我对cron知之甚少,我最好先问一下。

我正在编写一个用于调度组中共享任务的iPhone应用程序的API。这将需要在不同时间发送推送通知。这是一个例子:

人员A为人员B分配任务,在n天内完成。添加此任务,通知人员B已分配任务,并在n-1天后发送提醒通知,如果任务在n天后未完成,则发送另一通知,提醒人员B他们未能完成任务。

我的假设是这个过程会像这样:

  • 当最初分配任务并将任务添加到数据库时,将调用cron调度脚本,该脚本将调度2个cron作业 - 1个用于触发提醒通知,1个用于触发失败通知。
  • 当任务完成后,它会调用另一个脚本,该脚本在DB中将任务标记为已完成(或将其删除),并取消调度cron作业。

我是否离开这里,或者这是最简单的方法吗?如果是 - 是否有任何PHP类可以更容易地动态调度(和取消调度)cron作业?

5 个答案:

答案 0 :(得分:0)

你可以每天开一次cron工作。

如果需要发送提醒,则会循环访问数据库中的数据(例如,今天是n-1天,发送通知)。

如果该日期已过,且未完成,则可以发送失败通知。

如果任务完成,那么您可以更改该cron任务中的数据库,或者更频繁触发的单独数据库。

希望这有帮助。

答案 1 :(得分:0)

我的建议是:确定所需的最快响应(每分钟,每10分钟,每小时等)并在该时间范围内运行cron脚本。

脚本本身可以是PHP,当脚本运行时,它会指出要做什么,需要采取什么行动等。

答案 2 :(得分:0)

我最近在邮件队列上工作,我按如下方式实现: 有一个cron作业每分钟触发一个脚本,检查数据库是否包含队列中的任何电子邮件。如果找到它们,脚本会将它们发送出去。

还有另一个cron作业,每天都会将计划的电子邮件添加到数据库中(具有指定的时间,何时发送)。

因此,有一个每日cron作业生成要在不同时间处理的作业,还有另一个作业不断运行并处理队列中的作业。

添加一些优先级机制也很容易。

答案 3 :(得分:0)

您的主机可能会在您的主机控制面板中提供cron功能。我曾几次使用它,我发现这是一个放入文件的情况,你要在服务器上运行路径,然后从几个下拉菜单中选择频率。从那里你离开..

至于解决方案,你可以拥有一个非常简单的例子......

cron.php

<?php

/*

Steps
1 - Set any completed tasks to done
2 - Check if users need to be notified and send the notifications

*/

function send_notifications($email,$time_ends){

// insert code here to deal with sending the notification to the iphone

}



include("db.php"); // contains your MySQL connection vars or whatnot

// STEP 1 - Set any completed tasks to done
$update_db = mysql_query("UPDATE Notifications SET complete = '1' WHERE time_completed > '0000-00-00 00:00:00'");


// STEP 2 - Send any outstanding notifications out
$result = mysql_query("SELECT * FROM Notifications WHERE time_completed = '0000-00-00 00:00:00'"); // add another where clause to prevent bombarding with notifications for example " AND notification_2_days = '0'"
while($row = mysql_fetch_array($result))
{
  send_notifications($row['email'],$row['time_ends']);
  // insert an update query here to flag as a notification sent, you dont want to bombard
}


?>

警告 - 为了简单起见,这是使用折旧的连接代码(查找MySQL PDO等),这缺乏任何安全性。

答案 4 :(得分:0)

cron非常适合定期运行的脚本,但是如果你想在特定时间运行一次性(或两次)脚本,你可以使用unix'at'命令,你可以这样做直接从php使用这样的代码:

/****
 * Schedule a command using the AT command
 *
 * To do this you need to ensure that the www-data user is allowed to
 * use the 'at' command - check this in /etc/at.deny
 *
 *
 * EXAMPLE USAGE ::
 *
 * scriptat( '/usr/bin/command-to-execute', 'time-to-run');
 * The time-to-run shoud be in this format: strftime("%Y%m%d%H%M", $unixtime)
 *
 **/

function scriptat( $cmd = null, $time = null ) {
    // Both parameters are required
    if (!$cmd) {
        error_log("******* ScriptAt: cmd not specified");
        return false;
    }
    if (!$time) {
        error_log("******* ScriptAt: time not specified");
        return false;
    }

    // We need to locate php (executable)
    if (!file_exists("/usr/bin/php")) {
        error_log("~ ScriptAt: Could not locate /usr/bin/php");
        return false;
    }

    $fullcmd = "/usr/bin/php -f $cmd";

    $r = popen("/usr/bin/at $time", "w");
    if (!$r) {
        error_log("~ ScriptAt: unable to open pipe for AT command");
        return false;
    }
    fwrite($r, $fullcmd);
    pclose($r);

    error_log("~ ScriptAt: cmd=${cmd} time=${time}");

    return true;
}