1. 程式人生 > >Wordpress效能優化:使用crontab+wp-cli代替wp-cron

Wordpress效能優化:使用crontab+wp-cli代替wp-cron

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';
}
參考文件: https://github.com/wp-cli/wp-cli/issues/4073