3

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

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

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

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

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

我在这里离基地很远吗,还是这是最简单的方法?如果是 - 是否有任何 PHP 类可以更轻松地动态调度(和取消调度)cron 作业?

4

5 回答 5

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 等),这缺乏任何类型的安全性。

于 2012-09-24T11:40:41.203 回答
0

你可以有一个每天触发一次的 cron 作业。

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

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

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

希望这会有所帮助。

于 2012-09-24T11:26:21.127 回答
0

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

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

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

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

于 2012-09-24T11:31:14.160 回答
0

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

脚本本身可以是 PHP,当脚本运行时,它会确定要做什么,需要什么操作等。

于 2012-09-24T11:29:35.843 回答
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;
}
于 2014-08-11T10:38:04.443 回答