主页/WordPress笔记/博客文章/开发文章/WordPress队列任务分页处理代码

WordPress队列任务分页处理代码

以下是根据需求实现的分页游标处理队列任务的代码,包含详细的注释说明:

function qian_process_queue() {
    global $wpdb;
    $table_name = $wpdb->prefix . QIAN_TABLE_NAME;
    $per_page = 100; // 每页处理数量
    $last_id = 0;    // 初始化游标(起始ID)
    $processed = 0;  // 总处理计数

    // 持续获取数据直到处理完毕
    do {
        // 获取当前批次数据(按ID升序保证顺序)
        $batch = $wpdb->get_results(
            $wpdb->prepare(
                "SELECT * FROM $table_name 
                WHERE id > %d AND status = 'pending' 
                ORDER BY id ASC 
                LIMIT %d",
                $last_id,
                $per_page
            )
        );

        // 当前批次无数据则结束循环
        if (empty($batch)) break;

        // 处理当前批次
        foreach ($batch as $task) {
            // 执行任务处理函数
            $result = todo($task); // 替换为实际任务函数

            // 更新任务状态(根据实际需求)
            $wpdb->update(
                $table_name,
                ['status' => $result ? 'completed' : 'failed'], // 处理结果状态
                ['id' => $task->id],
                ['%s'],  // 状态字段格式
                ['%d']   // ID字段格式
            );

            // 更新游标为当前任务ID
            $last_id = $task->id;
            $processed++;
        }

        // 释放内存(大数据量时重要)
        unset($batch);

        // 可选:添加延迟防止服务器过载
        // usleep(50000); // 50毫秒延迟

    } while (true); // 通过内部break退出循环

    return $processed; // 返回总处理数量
}

关键实现说明:

  1. 游标分页机制
  • 使用 id > %d 条件实现高效游标分页
  • 每次获取大于最后处理ID的100条记录
  • 按ID升序保证处理顺序
  1. 内存优化
  • 每批仅处理100条记录
  • 处理完成后释放当前批次内存
  • 避免一次性加载全部数据
  1. 任务处理流程
  • 只处理状态为 pending 的任务
  • 调用 todo($task) 执行实际任务
  • 根据处理结果更新任务状态
  1. 扩展性考虑
  • 可添加 usleep() 控制处理频率
  • 支持状态字段扩展(失败重试等逻辑)
  • 返回处理总数便于监控

使用示例:

// 在后台任务处理器中调用
add_action('qian_daily_processing', 'handle_queue_processing');

function handle_queue_processing() {
    $processed = qian_process_queue();
    error_log("[QIAN] 本次处理完成,共处理 {$processed} 个任务");
}

// 添加定时任务(示例)
if (!wp_next_scheduled('qian_daily_processing')) {
    wp_schedule_event(time(), 'hourly', 'qian_daily_processing');
}

重要提示

  1. todo() 替换为实际任务处理函数
  2. 建议通过WP-Cron或自定义后台进程调用
  3. 大数据量时考虑添加任务锁防止并发冲突
  4. 根据业务需求完善错误处理(如失败重试机制)

此实现通过游标分页有效避免了传统分页的深度分页性能问题,特别适合处理大型队列任务,同时保持较低的内存消耗。