以下是根据需求实现的分页游标处理队列任务的代码,包含详细的注释说明:
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; // 返回总处理数量
}
关键实现说明:
- 游标分页机制:
- 使用
id > %d条件实现高效游标分页 - 每次获取大于最后处理ID的100条记录
- 按ID升序保证处理顺序
- 内存优化:
- 每批仅处理100条记录
- 处理完成后释放当前批次内存
- 避免一次性加载全部数据
- 任务处理流程:
- 只处理状态为
pending的任务 - 调用
todo($task)执行实际任务 - 根据处理结果更新任务状态
- 扩展性考虑:
- 可添加
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');
}
重要提示:
- 将
todo()替换为实际任务处理函数- 建议通过WP-Cron或自定义后台进程调用
- 大数据量时考虑添加任务锁防止并发冲突
- 根据业务需求完善错误处理(如失败重试机制)
此实现通过游标分页有效避免了传统分页的深度分页性能问题,特别适合处理大型队列任务,同时保持较低的内存消耗。

