[WordPress] 詳解定時定期運作的服務: WP-Cron

本篇文章更新時間:2020/03/29
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~


定時定期執行這技術或者說是設計在 WordPress 裡面扮演重要的隱藏角色之一!

這件事要知道它的重要性可以先聯想「手錶」或其他可以看時間的工具。你會看手錶或手機來注意時間,正是因為你有些事需要等待時間到了後才能做,像是:訂春節返鄉高鐵票、搶演唱會門票、跟朋友約吃飯或追某個八點檔等等。

WordPress 也不例外,像是它會定期檢查外掛或主題是否需要更新、訂單還沒付款的是否要取消、排程發表的文章是否要發佈了等等。

但 WordPress 本身自己不會執行,在 HTTP 協定的限制下,網站是「被請求後」才執行,被動的接受請求,然後回應請求。

那像人一樣,自己主動看手錶知道現在幾點幾分完成任務是怎麼辦到的?

其實辦不到。

WordPress 網站主要是有流量時被每一個瀏覽者於瀏覽時觸發看錶的行為,藉程式觸發來跟主機檢查是否到期需要執行任務。

所以,如果你的網站沒什麼流量,或是快取外掛強力作用下導致觸發不到「看錶」,那這些需要定時定期啟動的功能就會失靈。

如何確認自己網站的 Cron 排程功能正常?

安裝查看 Cron 任務的外掛(像是 WP Crontrol ) 然後看看目前網站上跑的任務有哪些,以及他們下一次觸發的時間是否很多都一樣,一樣的話代表這些任務都超過預定執行時間,被齊頭調整過了。

還有一點有趣的,很久沒有人瀏覽的網站,你如果瀏覽時有感覺第一個頁面特別慢的話,正是因為這時候背景一次去解決那些大量過期的任務導致。

我網站才剛建立沒有流量,沒辦法觸發排程以及預約文章發佈怎辦?

可以切換為人工手動觸發的方式,改轉由網站主機的定時工具 Crontab 來觸發:

*/15 * * * * /usr/bin/curl "https://www.mxp.tw/wp-cron.php?doing_wp_cron" > /dev/null 2>&1

如上範例(自行取代為自己的網域),每十五分鐘觸發一次,就能有相對準確運作的 WP Cron 服務囉!(此部分需要搭配主機管理來操作,我只舉例其中一種做法。)

網站主機的 Crontab 服務是主動且較為穩定的功能,如果網站經營初期碰到因為流量不足導致定時定期功能失常,轉由主機來觸發的解法也不錯。

如果日後這個功能都想改轉由網站主機來觸發的話,可以補上 define('DISABLE_WP_CRON', true); 這段至 wp-config.php 裡。然後一樣上面的 Crontab 修改方式。細節可參考官方文件 Hooking WP-Cron Into the System Task Scheduler

要特別注意的是,一但使用上面的常數 DISABLE_WP_CRON 設定後,WordPress 內建的 Cron 機制(wp-includes/cron.php)就不再運作,要確保自己在主機內的 Crontab 有發揮效果,不然會導致服務中斷哦!

網路上很多教學都是會先說設定 DISABLE_WP_CRON 常數後再補 Crontab 設定,雖然沒錯,但如果搬家換主機後忘記處理主機這塊的設定,就會發生問題。

結語

WordPress 這個功能是內建的機制,就像很多外掛一樣。但不同的是,這個功能對安裝外掛來管理有個前提,就是他真的要運作正常才有用。不然安裝了外掛以為可以管理,可其實外掛僅只是把任務列出來,並不會幫助你準時的去觸發哦!

想辦法讓自己網站有觀看流量,不然就是使用主機觸發的方式吧~


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

參與討論

2 則留言

  1. 如果訪客不停的訪問wp_cron,會不會增加服務器的負載,有辦法限制wp_cron訪問來源或者訪問次數嗎?

    1. 任何資源如果被大量存取都有可能會增加負擔。就 Cron 來說,一般還會在伺服器上針對這個請求的 IP 限制為當前主機,但這部分就要有點伺服器管理的概念來設定了!(然後要記得從主機端設定 Crontab)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *