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:
define('DISABLE_WP_CRON', true);
2.通過crontab定期執行任務
添加以下任務到crontab中(每分鍾檢查過期任務,如果有就執行)
* * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null
就是這么簡單。
如何判斷定時任務正常執行?
1.首先確認crontab有正常調用你的命令
查看下cron的日志: tail /var/log/cron,看到類似如下的日志說明crontab有在正常調用命令。
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 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)
2.然后確認你的命令有正確執行
兩種方法:
一、可以去掉`> /dev/null`,這樣每次crontab執行的輸出都會寫入郵件,通過mail命令可以看到每次的執行結果。
二、另外一種判斷方法是,通過wp cron event list判斷,下面着重講這個方法。
如下示例,你會看到有一些任務的next_run_relative為now,它們表示這些任務該執行了。如果你過了1分鍾再查看,它們的狀態都沒變化,說明任務並沒有得到執行。
$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_HOST
A:在wp-config.php中添加
if (defined('WP_CLI') && WP_CLI) { $_SERVER['HTTP_HOST'] = 'localhost'; }