* LiteSpeed Cache CLI Crawler Commands
* Provides WP-CLI commands for managing LiteSpeed Cache crawlers.
defined('WPINC') || exit();
use LiteSpeed\Crawler as Crawler2;
class Crawler extends Base {
* Constructor for Crawler CLI commands
public function __construct() {
Debug2::debug('CLI_Crawler init');
$this->crawler = Crawler2::cls();
* Displays a table of all crawlers with their details.
* $ wp litespeed-crawler l
* Displays a table of all crawlers with their details.
* $ wp litespeed-crawler list
$crawler_list = $this->crawler->list_crawlers();
$summary = Crawler2::get_summary();
if ($summary['curr_crawler'] >= count($crawler_list)) {
$summary['curr_crawler'] = 0;
$is_running = time() - $summary['is_running'] <= 900;
$crawler_run_interval = defined('LITESPEED_CRAWLER_RUN_INTERVAL') ? LITESPEED_CRAWLER_RUN_INTERVAL : 600; // Specify time in seconds for the time between each run interval
if ($crawler_run_interval > 0) {
$hours = (int) floor($crawler_run_interval / 3600);
$recurrence .= sprintf(__('%d hours', 'litespeed-cache'), $hours);
$recurrence .= sprintf(__('%d hour', 'litespeed-cache'), $hours);
$minutes = (int) floor(($crawler_run_interval % 3600) / 60);
$recurrence .= sprintf(__('%d minutes', 'litespeed-cache'), $minutes);
$recurrence .= sprintf(__('%d minute', 'litespeed-cache'), $minutes);
foreach ($crawler_list as $i => $v) {
$hit = !empty($summary['crawler_stats'][$i][Crawler2::STATUS_HIT]) ? $summary['crawler_stats'][$i][Crawler2::STATUS_HIT] : 0;
$miss = !empty($summary['crawler_stats'][$i][Crawler2::STATUS_MISS]) ? $summary['crawler_stats'][$i][Crawler2::STATUS_MISS] : 0;
$blacklisted = !empty($summary['crawler_stats'][$i][Crawler2::STATUS_BLACKLIST]) ? $summary['crawler_stats'][$i][Crawler2::STATUS_BLACKLIST] : 0;
$blacklisted += !empty($summary['crawler_stats'][$i][Crawler2::STATUS_NOCACHE]) ? $summary['crawler_stats'][$i][Crawler2::STATUS_NOCACHE] : 0;
if (isset($summary['crawler_stats'][$i][Crawler2::STATUS_WAIT])) {
$waiting = $summary['crawler_stats'][$i][Crawler2::STATUS_WAIT] ?? 0;
$waiting = $summary['list_size'] - $hit - $miss - $blacklisted;
$analytics = 'Waiting: ' . $waiting;
$analytics .= ' Hit: ' . $hit;
$analytics .= ' Miss: ' . $miss;
$analytics .= ' Blocked: ' . $blacklisted;
if ($i === $summary['curr_crawler']) {
$running = 'Pos: ' . ($summary['last_pos'] + 1);
$status = $this->crawler->is_active($i) ? '✅' : '❌';
'Name' => wp_strip_all_tags($v['title']),
'Frequency' => $recurrence,
'Analytics' => $analytics,
WP_CLI\Utils\format_items('table', $list, array( 'ID', 'Name', 'Frequency', 'Status', 'Analytics', 'Running' ));
* : The ID of the crawler to enable.
* $ wp litespeed-crawler enable 2
* @param array $args Command arguments.
public function enable( $args ) {
if ($this->crawler->is_active($id)) {
WP_CLI::error('ID #' . $id . ' had been enabled');
$this->crawler->toggle_activeness($id);
WP_CLI::success('Enabled crawler #' . $id);
* : The ID of the crawler to disable.
* $ wp litespeed-crawler disable 1
* @param array $args Command arguments.
public function disable( $args ) {
if (!$this->crawler->is_active($id)) {
WP_CLI::error('ID #' . $id . ' has been disabled');
$this->crawler->toggle_activeness($id);
WP_CLI::success('Disabled crawler #' . $id);
* $ wp litespeed-crawler r
* $ wp litespeed-crawler run
self::debug('⚠️⚠️⚠️ Forced take over lane (CLI)');
$this->crawler->Release_lane();
Task::async_call('crawler');
$summary = Crawler2::get_summary();
WP_CLI::success('Start crawling. Current crawler #' . ($summary['curr_crawler'] + 1) . ' [position] ' . $summary['last_pos'] . ' [total] ' . $summary['list_size']);
* # Reset crawler position
* $ wp litespeed-crawler reset
public function reset() {
$this->crawler->reset_pos();
$summary = Crawler2::get_summary();
WP_CLI::success('Reset position. Current crawler #' . ($summary['curr_crawler'] + 1) . ' [position] ' . $summary['last_pos'] . ' [total] ' . $summary['list_size']);