WordPress Cron 的工作原理

已發表: 2021-12-03

你有沒有想過 WP-Cron 是什麼? 如果是這樣,那麼這是您了解有關 WordPress 計劃任務的所有信息的完美文章。

Cron (Command Run On) 是一個在 UNIX 系統中啟動的實用程序,後來在 LINUX 發行版上演變而來,該發行版被提議作為基於時間的作業調度程序。

cron 作業是重複執行或作為一次性任務執行的任務。 多年來,它主要用作自動運行任務的系統管理工具。

WordPress 定時任務

在運行 WordPress 網站時,一些需要定期執行的任務在後台執行,例如檢查主題和插件的更新、預定的帖子、要刪除的瞬態等等。 這些基於時間的計劃任務由 WP-Cron 處理。

在您的 WordPress 安裝中,與 cron 作業相關的文件是wp-cron.php文件,位於安裝的根文件夾中。

wp-cron.php 文件包含與更新和帖子相關的自動化任務的代碼。

這個怎麼運作

WP-Cron 在每次頁面加載時檢查任務列表並相應地執行。

如果頁面加載的那一刻,任務到期,它被添加到隊列中。 這樣,WordPress 確保即使是到期事件也會被觸發而不是被跳過,最終所有任務都將在該頁面加載時執行。

如果這對您來說似乎不合理,那是很自然的,但請考慮替代方案。 在大多數情況下,在共享主機環境中,您應該有權訪問服務器命令,以便按照您認為合適的方式控制這些任務,但這對服務器來說不會有風險嗎?

因此,請考慮 WordPress 在這種情況下的解決方法。 但是,這有一些缺點,我們稍後會檢查。

WP-Crontrol 插件

在您的 WordPress 網站中查看 cron 作業列表的一種非常簡單的方法是安裝 WP-Crontrol 插件。

激活後,您可以在 Tools->Cron Events 菜單項下查看插件的管理頁面。 在 vanilla 安裝中,您將看到如下內容:

如果您將鼠標懸停在每一行上,您會注意到提供了用於編輯或運行任何事件的操作。

例如,在 wp_update_themes 事件的編輯屏幕中,您可以修改其設置

在 Settings -> Cron Schedules 菜單項下,您可以查看默認計劃,如果需要,添加您自己的計劃並為其命名以在列表中查看。

如何創建 Cron 作業

要手動添加 cron 作業,您所要做的就是編輯主題的functions.php文件。 為了演示一個簡單的示例,請使用您喜歡的編輯器打開它並添加以下代碼:

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); }

其中“my_cronjob”是您的鉤子的名稱,“my_cronjob_function”是您的函數的名稱,該函數將簡單地向您定義的地址發送一封電子郵件,方法是將 EMAIL_ADDRESS 替換為所需的地址。

接下來,我們需要安排這個鉤子在我們想要的時間執行。

如何運行一次作業

要將操作作為一次性 WP-Cron 作業執行,我們必須使用 wp_schedule_single_event() WordPress 內置函數,該函數旨在在指定時間觸發掛鉤。 它的結構是這樣的:

wp_schedule_single_event( $timestamp, $hook, $args, $wp_error )

其中 $timestamp 是下次運行事件的 Unix 時間戳,$hook 是運行事件時要執行的操作掛鉤。

這兩個參數都是必需的。 現在讓我們談談可選參數。

使用 $args 參數,您可以使用包含參數的數組來傳遞給鉤子的回調函數。 數組中的每個值都作為單獨的參數傳遞給回調。 數組鍵被忽略。

$wp_error 參數可用於在失敗時返回 WP_Error。 它的默認值為假。

我們的functions.php文件中的相應代碼將是這樣的:

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } wp_schedule_single_event( time() + 3600, 'my_cronjob' );

此時您應該能夠在列表中看到您的自定義任務。

如何將作業作為重複事件運行

WordPress 為這種情況提供的是 wp_schedule_event() 函數,其結構如下

wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error)

$timestamp 參數是下一次運行事件時所需的 Unix 時間戳,$recurrence 是一個字符串,也是事件隨後應該多久重複一次的字符串,$hook 是事件運行時要執行的動作掛鉤。

可選的 $args 和 $wp_error 參數與之前相同。

運行該作業的重複時間為 1 小時的代碼是這樣的:

 add_action('my_hourly_cronjob', 'hourly_action'); function hourly_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_hourly_cronjob' )) { wp_schedule_event(time(), 'hourly', 'my_hourly_cronjob'); }

我們在上面看到的“if”語句中使用了 wp_next_scheduled() 函數,以避免重複事件並確保在繼續運行之前尚未安排任務。

我們還使用了 Settings -> Cron Schedules 下計劃表中的“每小時”標籤。 如果我們想要一個不同的事件,比如說每 45 分鐘,我們應該首先創建一個名為“45_minutes”的自定義 Cron 計劃,然後在代碼中使用它。

 add_action('my_45_cronjob', 'my_45_action'); function my_45_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_45_cronjob' )) { wp_schedule_event(time(), '45_minutes', 'my_45_cronjob'); }

此時,您應該能夠在列表中看到您的自定義任務以及預期的更改:

WP-Cron 缺點

WordPress 處理 cron 作業的方式確保任務將運行,但不允許您指定何時運行,因為正如我們所說,檢查是在訪問者加載您網站的頁面時完成的。

如果我們將 cron 作業控制傳遞給用戶的訪問時間,那麼無論網站的大小或受歡迎程度如何,我們都有可能對網站產生負面影響。

使用 Pressidium 託管您的網站

60 天退款保證

查看我們的計劃

以熱門網站為例,由於同時執行大量任務,您將體驗到大量流量。 這可能會消耗您的服務器資源並影響性能,甚至導致您的網站停機。

在小型網站的情況下,這意味著訪問者很少,wp-cron 不會被如此頻繁地觸發,因此一些重要的 cron 作業可能會被推遲足夠的時間來產生副作用,比如沒有進行足夠的備份,或者延遲更新一些計入 cron 作業的數據。

禁用 WP-Cron

如果 WP-Cron 處理 cron 作業的方式不符合您的要求,並且您需要按時執行任務,那麼您應該禁用 WP-Cron 並使用服務器端 cron 服務。

如果您的託管服務提供商尚未提供禁用 WP-Cron 的選項,那麼您可以自己執行此操作。

使用您喜歡的編輯器打開位於安裝根文件夾下的wp-config.php文件,並找到與數據庫表前綴相關的行。 緊接著,插入這一行:

 // /** * WordPress Database Table prefix. * * You can have multiple installations in one database if you give each * a unique prefix. Only numbers, letters, and underscores please! */ $table_prefix = 'wN0b9WQk_'; define('DISABLE_WP_CRON', 'true');

如果您想使用更穩定的調度程序,例如 Linux cron 服務,以便在更適合您時觸發 wp-cron.php,這是強制性的。

服務器端解決方案: Linux Cron 服務

在 Pressidium,我們使用 Linux Crontab 每 5 分鐘觸發一次 WP-Cron。 正確的時間量可以確保您的計劃作業按時執行,同時避免您的 WordPress 網站超載。 這不會干擾 WP-Cron 調度程序,而只會干擾觸發機制。

結論

希望本文能幫助您熟悉 WordPress Cron、它是什麼以及它是如何工作的,以及如何創建自己的日程安排和任務。 在選擇其他服務器端解決方案之前,請三思而後行 WP-Cron 是否足以滿足您的要求。