3

Cron がこれに対する最良の答えかもしれないと思いますが、その作業は困難なようで、cron についてほとんど知らないので、最初に質問するのがおそらく最善です。

グループで共有タスクをスケジュールする iPhone アプリケーション用の API を作成しています。これには、さまざまなタイミングでプッシュ通知を送信する必要があります。以下に一例を示します。

人 A は、人 B に n 日で完了するタスクを割り当てます。このタスクが追加され、担当者 B にタスクが割り当てられたことが通知され、n-1 日後にリマインダー通知が送信されます。タスクが n 日経過しても完了しなかった場合は、別の通知が送信され、担当者 B がタスクを完了できなかったことを警告します。仕事。

ここでの私の仮定は、プロセスは次のようになるということです。

  • タスクが最初に割り当てられ、タスクが DB に追加されると、2 つの cron ジョブをスケジュールする cron スケジューリング スクリプトが呼び出されます。1 つはリマインダー通知を起動し、もう 1 つは失敗通知を起動します。
  • タスクが完了すると、別のスクリプトが呼び出され、DB でタスクを完了としてマーク (または削除) し、cron ジョブのスケジュールを解除します。

私はここで基地から離れていますか、それともこれがこれを引き受ける最も簡単な方法ですか? もしそうなら - cron ジョブを動的にスケジュール (およびスケジュール解除) しやすくするための PHP クラスはありますか?

4

5 に答える 5

0

私は最近、メーリング キューに取り組み、次のように実装しました。 データベースのキューに電子メールが含まれているかどうかを確認するスクリプトを毎分起動する 1 つの cron ジョブがあります。それらが見つかった場合、スクリプトはそれらを送信します。

スケジュールされた電子メールをデータベースに追加する毎日起動する別のcronジョブがあります(指定された時間で、いつ送信するか)。

そのため、さまざまな時間に処理されるジョブを生成する毎日の cron ジョブと、常に実行されキュー内のジョブを処理する別の cron ジョブがあります。

いくつかの優先度メカニズムも簡単に追加できます。

于 2012-09-24T11:31:14.160 に答える
0

cron は定期的に実行されるスクリプトに最適ですが、特定の時間に 1 回限り (または 2 回限り) のスクリプトを実行する場合は、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 に答える
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

毎日 1 回起動する cron ジョブを作成できます。

これは、リマインダーを送信する必要がある場合、データベース内のデータをループします (たとえば、今日が n-1 日である場合、通知を送信します)。

その日付が過ぎても完了していない場合は、失敗通知を送信できます。

タスクが完了したら、その cron タスクでデータベースを変更するか、より頻繁に起動する別のタスクを変更できます。

うまくいけば、それは役に立ちます。

于 2012-09-24T11:26:21.127 に答える
0

私のアドバイスは次のとおりです。必要な最速の応答を決定し (毎分、10 分ごと、毎時など)、その時間枠内で cron スクリプトを実行します。

スクリプト自体はPHPである可能性があり、スクリプトを実行すると、何をすべきか、どのアクションが必要かなどがわかります。

于 2012-09-24T11:29:35.843 に答える