Wordpress效能優化:使用crontab+wp-cli代替wp-cron
阿新 • • 發佈:2018-12-07
wp-cron的問題
Wordpress內建wp-cron的模組,可以用來執行定時任務,比如定時檢查更新,定時釋出文章等都需要用到,屬於必備功能。
但是該模組的特點是:它只能在使用者發起請求時檢查定時任務。這個特點導致了一個問題:沒有使用者訪問時,那定時任務就得不到執行;有使用者訪問時,某個使用者會因為定時任務在執行而響應很慢甚至超時。因此,在生產環境下使用wp-cron是不明智的。
更好的做法是開啟一個獨立的程序執行這些定時任務——這裡使用crontab + wp-cli實現這種做法。(如果你不使用wp-cli,也可以,但是wp-cli,但是在有wp-cli的情況下,你可以方便地檢視各個任務的具體執行情況,和對任務做精確的控制。沒有命令列工具的情況下就有點要靠猜了)
兩步完成優化
1.禁用wp-cron:修改wp-config.php,設定DISABLE_WP_CRON為true:
1.首先確認crontab有正常呼叫你的命令
檢視下cron的日誌: tail /var/log/cron,看到類似如下的日誌說明crontab有在正常呼叫命令。
define('DISABLE_WP_CRON', true);2.通過crontab定期執行任務 新增以下任務到crontab中(每分鐘檢查過期任務,如果有就執行)
* * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null
就是這麼簡單。
如何判斷定時任務正常執行?Dec 7 11:40:01 aliyun CROND[9189]: (liu) CMD (cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null) Dec 7 11:40:01 aliyun CROND[9190]: (liu) CMD (/usr/lib64/sa/sa1 12.然後確認你的命令有正確執行 兩種方法: 一、可以去掉`> /dev/null`,這樣每次crontab執行的輸出都會寫入郵件,通過mail命令可以看到每次的執行結果。 二、另外一種判斷方法是,通過wp cron event list判斷,下面著重講這個方法。 如下示例,你會看到有一些任務的next_run_relative為now,它們表示這些任務該執行了。如果你過了1分鐘再檢視,它們的狀態都沒變化,說明任務並沒有得到執行。1) Dec 7 11:41:01 aliyun CROND[9285]: (liu) CMD (cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null)
$wp cron event list +------------------------------------------+---------------------+-----------------------+------------+ | hook | next_run_gmt | next_run_relative | recurrence | +------------------------------------------+---------------------+-----------------------+------------+ | jetpack_display_posts_widget_cron_update | 2018-12-06 10:48:49 | now | 10 minutes | | jetpack_sync_cron | 2018-12-06 10:48:55 | now | 5 minutes | | jetpack_sync_full_cron | 2018-12-06 10:48:55 | now | 5 minutes | | jp_sitemap_cron_hook | 2018-12-06 10:52:42 | 1 minute 59 seconds | 12小時 | | jetpack_clean_nonces | 2018-12-06 11:08:49 | 18 minutes 6 seconds | 1小時 | 。。。 +------------------------------------------+---------------------+-----------------------+------------+反之,如果任務得到了執行,那些為`now`的狀態應該會變掉,如下面的結果所示:
$wp cron event list +------------------------------------------+---------------------+-----------------------+------------+ | hook | next_run_gmt | next_run_relative | recurrence | +------------------------------------------+---------------------+-----------------------+------------+ | jetpack_sync_cron | 2018-12-07 03:53:55 | 41 seconds | 5 minutes | | jetpack_sync_full_cron | 2018-12-07 03:53:55 | 41 seconds | 5 minutes | | jetpack_display_posts_widget_cron_update | 2018-12-07 03:58:49 | 5 minutes 35 seconds | 10 minutes | | jetpack_clean_nonces | 2018-12-07 04:08:49 | 15 minutes 35 seconds | 1小時 | 。。。 +------------------------------------------+---------------------+-----------------------+------------+
配置過程中碰到的問題 Q:執行wp cron event run --due-now時,可能出現下面的提示:
PHP Notice: Undefined index: HTTP_HOSTA:在wp-config.php中新增
if (defined('WP_CLI') && WP_CLI) { $_SERVER['HTTP_HOST'] = 'localhost'; }參考文件: https://github.com/wp-cli/wp-cli/issues/4073