簡體   English   中英

PHP:運行預定作業(cron 作業)

[英]PHP: running scheduled jobs (cron jobs)

我的 webhotel 上有一個站點,我想在其上運行一些計划任務。 您會推薦哪些方法來實現這一目標?

到目前為止,我想到的是在每個頁面的頂部包含一個腳本,然后讓該腳本檢查是否該運行此作業。

這只是我在想的一個簡單的例子:

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

還有什么我應該考慮的,或者有比這更好的方法嗎?

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

我現在回答這個是因為似乎沒有人提到這個確切的解決方案。

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

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

-q是這樣 wget 不會產生任何輸出(所以你不會一直收到電子郵件)。 -O cron_job.log會將您的控制器生成的任何內容保存到日志文件中(每次都被覆蓋,因此它不會繼續增長)。

我發現這是讓“正確”cron 工作的最簡單方法。

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

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

你有沒有看過ATrigger PHP 庫也可用於在沒有任何開銷的情況下開始創建計划任務。

免責聲明:我在他們的團隊中。

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

一個副作用是每次運行時您都會收到一封電子郵件。 為了解決這個問題,我讓我的 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("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>

如果您想避免設置 cron 作業等(盡管我建議這是一種更好的方法),那么您提供的解決方案非常好。 在許多項目中,我已經讓 PHP 腳本本身進行檢查以查看是否需要運行更新。

不利的一面(好吧,不利的一面之一)是,如果在特定時期內沒有人使用該應用程序,則腳本將無法運行。

好處是,如果在某個時期內沒有人使用該應用程序,則腳本將不會運行。 我設置它要做的任務是“更新緩存文件”、“進行每日備份”等等。 如果有人沒有使用該應用程序,那么您就不需要更新緩存文件,也不需要備份任何數據庫更改。

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

Cron 是用於調度問題的通用解決方案。 但是,當您變大並且日程安排頻率很高時,可能會出現可靠性/重疊問題。 如果您看到此類問題,請考慮使用諸如supervise或更復雜的monit 之類的東西。

如果您使用 cpanel,您應該添加如下內容:

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

您使用的方法很好,如果您不想使用 cronjobs 或任何外部內容,但是每次加載頁面時檢查這些方法可能很繁重。

起初,一些 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
}

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

這就是我會做的,因為我在我的寵物項目中這樣做。 玩得開心!

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

命令行 PHP + cron 將是我要走的路。 這很簡單,應該符合要求。 它通常與 PHP 一起安裝。

如果你想要更抽象的東西,你可以考慮使用像 PHP 調度程序這樣的東西。 例如:

而且,要解析 cron 表達式,您可以使用現有的庫,例如https://github.com/mtdowling/cron-expression 它提供了許多有用的方法來幫助您找出 cron 作業的信息。

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM