2012-09-24 110 views
3

我認爲Cron可能是最好的答案,但這項任務看起來令人望而生畏,而我對cron知之甚少,所以最好先問一下。動態安排PHP腳本執行

我正在編寫一個調度組中共享任務的iPhone應用程序的API。這將需要在不同時間發送推送通知。這裏有一個例子:

人A爲人B分配一個任務在n天內完成。該任務被添加,通知人員B任務已被分配,並且在n-1天后發送提醒通知,如果任務在n天后未完成,則發送另一通知以提醒人員B他們未能完成任務。

我在這裏的假設是,這一進程會去是這樣的:

  • 在任務初始分配和任務添加到數據庫,一個cron調度腳本將被稱爲這將安排2的cron作業 - 1發出提醒通知,另一個發出故障通知。
  • 當任務完成時,它會調用另一個腳本,它將任務標記爲在數據庫中完成(或刪除它),並取消調度cron作業。

我在這裏的基地,或者這是最簡單的方法來採取這項?如果是 - 是否有任何PHP類可以更輕鬆地動態調度(並取消調度)cron作業?

+1

有一個cron作業,以設定的時間間隔運行並輪詢數據庫的任務。爲每項獨特的任務安排一次性cron作業是一項巨大的資源浪費,並且可能變得非常複雜。這種方式可以簡單地通過調整數據庫來取消作業,並且一旦設置完成,您就不必再煩擾cron作業。 – DaveRandom

回答

0

你可以有一個cron工作,每天發生一次。

如果需要發送提醒(例如,今天n-1天發送通知),則循環訪問數據庫中的數據。

如果該日期已過,但未完成,則可發送失敗通知。

如果任務已完成,則可以更改該cron任務中的數據庫,或者更頻繁地觸發一個單獨的任務。

希望有幫助。

0

我的建議是:確定需要的最快響應(每分鐘,每10分鐘,每小時等),並在該時間範圍內運行cron腳本。

腳本本身可能是PHP,當腳本運行它的數字出來做什麼都需要,什麼樣的行動等

0

我最近在弄一個郵件隊列恩,我實現了它如下: 有是一個cron作業,每分鐘觸發一個腳本,檢查數據庫是否包含隊列中的任何電子郵件。如果發現它們,腳本會將它們發送出去。

還有另一個cron工作,每天都會向數據庫添加預定的電子郵件(指定時間,何時發送)。

因此,每天都有一個cron作業可以在不同時間生成需要處理的作業,另外還有一個不斷運行並處理隊列中的作業。

也很容易添加一些優先級機制。

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等),這缺乏任何安全性。

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; 
}