我认为Cron可能是最好的答案,但这项任务似乎令人生畏,我对cron知之甚少,我最好先问一下。
我正在编写一个用于调度组中共享任务的iPhone应用程序的API。这将需要在不同时间发送推送通知。这是一个例子:
人员A为人员B分配任务,在n天内完成。添加此任务,通知人员B已分配任务,并在n-1天后发送提醒通知,如果任务在n天后未完成,则发送另一通知,提醒人员B他们未能完成任务。
我的假设是这个过程会像这样:
我是否离开这里,或者这是最简单的方法吗?如果是 - 是否有任何PHP类可以更容易地动态调度(和取消调度)cron作业?
答案 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;
}