Scheduled Actions (已排程動作) 會用來處理和訂單相關的排程工作,當執行完排程工作之後,也會將完成工作的紀錄儲存在資料庫中,但長時間累積下來,儲存記錄的表單就會變成非常的臃腫,進而直接影響資料庫的效能。
WooCommerce 本身有考慮到這個隱性問題,所以也有設置了自動清除紀錄的機制,方式為針對存放超過一個月的紀錄,一條一條的刪除,但這個方式對於訂單量增長快速的商店並不太有效率,因為也有其它外掛同時在新增別的工作排程,然而排程增加的速度還可能會大於刪除的速度,一但又遇到訂單量大的活動時,就會影響資料庫的效能。
由上方範例圖片確認相關資料庫的表單大小:
$ wp db size --tables --human-readable +----------------------------------+--------+ | Name | Size | +----------------------------------+--------+ | wp_actionscheduler_actions | 122 MB | | wp_actionscheduler_logs | 66 MB | +----------------------------------+--------+
我們分享幾種可以清除 Scheduled Actions 的方式:
1. 使用 phpMyAdmin 進行刪除,這個方式比較簡單,可以在 SQL 的區塊執行下列指令,也可以登入 MySQL 直接執行,若是第一次使用,請分開輸入指令執行以確保安全:
DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'complete'; DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'canceled'; DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'failed';
2. 用短語法的方式定期自動刪除,可設為每日或是每週進行清理,依據商店的狀況選擇使用即可:
// 每日定期自動清除 Scheduled Actions add_filter( 'action_scheduler_retention_period', 'cw_action_scheduler_purge_daily' ); function cw_action_scheduler_purge() { return DAY_IN_SECONDS; }
// 每週定期自動清除 Scheduled Actions add_filter( 'action_scheduler_retention_period', 'cw_action_scheduler_purge_weekly' ); function cw_action_scheduler_purge() { return WEEK_IN_SECONDS; }
3. 讓能夠登入伺服器的管理員快速清除的方式,也可以利用 Cronjob 執行,這個方式雖然方便,但不建議把資料庫密碼存在腳本中,請先自行評估風險後再考慮是否採用。
#!/bin/bash user= password= database= host= echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "complete";' | mysql --user="$user" --password="$password" --database="$database" --host="$host" echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "canceled";' | mysql --user="$user" --password="$password" --database="$database" --host="$host" echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "failed";' | mysql --user="$user" --password="$password" --database="$database" --host="$host"