2008-09-23 222 views
34

我在我的webhotel上有一個網站我想運行一些計劃任務。你會推薦什麼方法來達到這個目標?PHP:運行預定作業(cron作業)

我到目前爲止的想法是在每個頁面的頂部都包含一個腳本,然後讓這個腳本檢查是否是時候運行這個工作。

這是什麼,我想只是一個簡單的例子:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) { 
    runTask(); 
    $timeToRunMaintainance = time() + $interval; 
} 

別的我應該考慮到或有更好的方法比這個?

回答

32

這就是cronjobs製作的。 man crontab假設你正在運行一個linux服務器。如果您沒有shell訪問權限或無法設置cronjobs,則可以使用免費服務在外部服務器上設置cronjob並ping您的一個URL。

+1

你知道有人可以推薦嗎? – Eikern 2008-09-23 10:38:49

+3

Siteuptime.com可以設置爲定期在您的網站上ping頁面 - 表面上檢查正常運行時間,但如果它們在可訪問的腳本中可能會觸發您的工作。最好的辦法是設置你自己的crontab /計劃任務,所以意外的用戶訪問不能重新運行你的工作 – ConroyP 2008-09-23 10:42:42

5

如果你想知道如何真正從cron運行你的PHP腳本,有兩種選擇:直接調用PHP解釋器(即「php /foo/myscript.php」)或使用lynx(lynx http://mywebsite.com/myscript.php) 。您選擇哪一個主要取決於您的腳本如何配置其環境 - 路徑和文件訪問權限將因您是通過shell還是Web瀏覽器調用而有所不同。我建議使用l。。

一個副作用是您每次運行時都會收到一封電子郵件。爲了解決這個問題,我讓我的cron PHP腳本沒有輸出(如果它們成功完成,它不會輸出任何內容,甚至不是空格),並且如果失敗,會輸出錯誤消息。然後我使用cron的一個小PHP腳本來調用它們。這樣,如果失敗,我只會收到一封電子郵件。這與lynx方法基本相同,除了我的shell腳本生成HTTP請求而不是lynx。

調用此腳本「docron」或其他內容(請記住chmod + x),然後在crontab中使用以下命令:「docron http://mydomain.com/myscript.php」。如果頁面返回一些內容,它會以HTML電子郵件的形式向您發送頁面的輸出。

#!/usr/bin/php 
<?php 

$h = @file_get_contents($_SERVER['argv'][1]); 

if ($h === false) 
{ 
     $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1]; 
} 

if ($h != '') 
{ 
     @mail("[email protected]", $_SERVER['argv']['1'], $h, "From: [email protected]\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1"); 
} 

?> 
+0

我完全同意這裏的意圖。如果不能直接調用解釋器,另一個好的選擇是wget。 – Laith 2008-09-23 13:59:58

0

命令行PHP + cron將是我會走的路。這很簡單,應該適合賬單。當然,它通常與PHP一起安裝。

12

如果您有一個cPanel主機,您可以通過Web界面添加cron作業。轉至高級 - > Cron Jobs並使用非高級表單設置cron頻率。你想這樣的命令:

/usr/bin/php /path/to/your/php/script.php 
+0

大我一直在尋找這個 我覺得對Perl我應該使用/ usr/bin中/ perl的:對 – 2009-03-27 19:40:43

4

如果你想避免設立cron作業和諸如此類的東西(雖然我建議這是一個更好的方法),您所提供的解決方案是相當不錯的。在許多項目中,我已經讓PHP腳本自己做了檢查,看看是否該運行更新了。

反面(好的,一個的下方)是,如果沒有人在某段時間內使用應用程序,那麼腳本將不會運行。

好方面是,如果沒有人在某段時間內使用應用程序,那麼腳本將不會運行。我設置的任務是「更新緩存文件」,「每日備份」等等。如果有人沒有使用該應用程序,那麼您將不需要更新的緩存文件,也不會有任何數據庫更改來備份。

我建議您對方法進行的唯一修改是您只有在某人成功登錄時才運行這些檢查。您無需檢查每個頁面加載情況。

14

我現在正在回答這個問題,因爲似乎沒有人提到過這個確切的解決方案。

在我目前正在使用的網站上,我們使用cPanel設置了一個cron作業,但不是直接運行PHP解釋器(因爲我們使用CodeIgniter並且我們的代碼映射到了控制器函數,這可能不是一個好主意),我們正在使用wget

wget -q -O cron_job.log http://somehost/controller/method 

-q是,這樣的wget將不產生任何輸出(這樣你就不會繼續得到電子郵件)。 -O cron_job.log會將您的控制器生成的內容保存到日誌文件中(每次覆蓋以使其不會持續增長)。

我發現這是獲得'正確'cron工作的最簡單方法。

+1

謝謝,我喜歡-q開關,因爲我一直在思考如何制止這些郵件的到來。你也可以分享你的提示:) – 2009-09-20 17:46:02

+1

-o location.log(小寫字母o代替大寫字母o)可用於輸出日誌(當未設置-q時,通常會在stdout上輸出日誌)。 -a和-o一樣,但附加到文件中,其中-o覆蓋。 – zpon 2012-03-26 11:28:09

4

Cron是一個調度問題的通用解決方案。但是,當你進行大規模的工作並且時間表頻率越來越高時,就會出現可靠性/重疊問題。如果您發現此類問題,請考慮諸如supervise或更復雜的monit

0

如果您沒有設置cronjob的選項,您可以使用cUrl調用腳本(作爲wget的替代方法 - 具有相同的功能)。只需在執行cUrl函數的本地機器上執行計劃任務即可。

1

如果您不想使用cronjob或外部任何內容,但您使用的方法很好,但每次頁面加載時可能會很沉重。

起初,一些cronjobs可能會被替換。例如,如果您有一個有多少用戶在您的網站上註冊的計數器,您可以在用戶註冊時簡單地更新此號碼,因此您不必爲此使用cronjob或任何計劃任務。

如果你想使用計劃任務,我建議你現在使用你正在使用的方法,但稍加修改。如果您的網站每天有足夠的點擊量,您只需將運行的任務(或任務檢查功能運行)僅設爲1%或約0.01%,而不是全部設置,則應使用的百分比取決於在頁面上點擊你有多少次,你想運行任務。因此,只需添加一個隨機數發生器即可實現此功能。

你可以簡單地使用這樣的功能;

if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent. 
    // Run the tasks system 
} 

希望這有助於

4

你有沒有看ATriggerPHP library也可用於開始創建計劃任務,無需任何開銷。

聲明:我是他們的團隊之一。

3

如果您使用的cPanelü應添加此類似:

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php 
1

我會外包cronjobs與www.guardiano.pm和調用一個網址每隔X分鐘。當你的url(即www.yoursite.com/dothis.php)被調用時,你會執行一些代碼。如果你不想讓網頁請求頁面時,你可以只允許在POST請求,併發送一些參數,只有你知道guardiano.pm

這就是我會做的,因爲我這樣做我的寵物項目。玩的開心!