
在WordPress中,多个AJAX请求共享同一数据库,但因对象缓存机制导致get_option()无法实时获取其他请求刚写入的选项值;需手动清除缓存才能确保长时任务准确响应取消指令。
在wordpress中,多个ajax请求共享同一数据库,但因对象缓存机制导致`get_option()`无法实时获取其他请求刚写入的选项值;需手动清除缓存才能确保长时任务准确响应取消指令。
WordPress 的 get_option() 函数默认启用对象缓存(Object Cache),以提升性能。当首次调用 get_option('batch_state') 后,该值会被缓存到内存(如 WordPress 的 WP_Object_Cache 实例)中;后续同名调用将直接返回缓存副本,不会重新查询数据库。因此,在一个长时间运行的 AJAX 请求(如批量处理)中,即使另一个并发请求通过 update_option('batch_state', 'cancelled') 成功更新了数据库,原请求中的 get_option() 仍持续返回旧的缓存值(如 'running'),造成“取消失效”。
要解决此问题,必须在每次循环中主动刷新或删除对应缓存项,而非依赖自动同步。推荐做法是精准清除特定选项缓存,而非全局刷新(wp_cache_flush() 开销大,影响其他并发请求):
add_action('wp_ajax_batch', 'my_ajax_batch_handler');
function my_ajax_batch_handler() {
// 初始化状态(同时清空可能存在的旧缓存)
update_option('batch_state', 'running');
wp_cache_delete('batch_state', 'options'); // 精准删除 options 组下的 batch_state 缓存
$values = get_batch_items(); // 替换为你的数据源逻辑
foreach ($values as $item) {
// 关键:每次检查前强制刷新该选项缓存
wp_cache_delete('batch_state', 'options');
$batch_state = get_option('batch_state');
if ($batch_state === false || $batch_state === 'cancelled') {
error_log('Batch cancelled by user.');
break;
}
// 执行单条处理逻辑(注意控制执行时间,避免超时)
process_single_item($item);
// 可选:添加微延迟或检查 PHP 超时,保障稳定性
if (time() > $_SERVER['REQUEST_TIME'] + 25) {
error_log('Batch paused due to time limit.');
update_option('batch_state', 'paused');
break;
}
}
update_option('batch_state', 'completed');
}对应的取消处理函数保持简洁高效:
add_action('wp_ajax_cancel_batch', 'my_ajax_cancel_batch_handler');
function my_ajax_cancel_batch_handler() {
check_ajax_referer('cancel_batch_nonce', 'nonce'); // 建议添加 nonce 验证
update_option('batch_state', 'cancelled');
// 清除缓存以加速其他潜在监听者响应(非必需,但推荐)
wp_cache_delete('batch_state', 'options');
wp_send_json_success(['message' => 'Cancellation signal sent.']);
}⚠️ 重要注意事项:
- wp_cache_delete('batch_state', 'options') 中的 'options' 是缓存组名,必须显式指定,否则可能删除失败;
- 避免在循环中调用 wp_cache_flush() —— 它会清空整个对象缓存,显著降低站点整体性能;
- 生产环境建议配合 set_time_limit(0)(谨慎使用)和分片处理(chunking)替代超长单次请求;
- 若启用外部缓存(如 Redis、Memcached),需确认其与 WordPress 对象缓存接口兼容,并确保 wp_cache_delete() 能正确穿透到底层存储;
- 始终对用户操作添加 nonce 验证与权限校验(如 current_user_can()),防止未授权取消。
综上,该问题本质是 WordPress 缓存一致性模型的设计特性,而非 Bug。通过精准缓存管理,即可在保持高性能的同时,实现跨请求的状态协同,为后台长任务提供可靠可控的生命周期管理能力。










