为了提升用户体验并加快REST API响应速度,我们可以将文件上传操作置于后台执行。这不仅能减少用户等待时间,还能有效避免因长时间请求导致的超时问题。
步骤一:将上传任务放入后台执行
首先,在handle_file_upload()
方法中添加代码以支持异步上传。一旦文件成功上传到服务器,我们将使用WordPress的定时任务功能来安排一个异步任务,用于后续上传到OSS(阿里云对象存储服务)。
// 文件上传成功后,添加异步上传任务
$attachment_id = wp_insert_attachment(...);
if (!is_wp_error($attachment_id)) {
// 异步上传到 OSS
if (!wp_next_scheduled('async_upload_to_oss', ['attachment_id' => $attachment_id])) {
wp_schedule_single_event(time() + 5, 'async_upload_to_oss', ['attachment_id' => $attachment_id]);
}
}
步骤二:注册异步事件监听器
接下来,你需要在插件的主文件或适当位置注册一个钩子,以便监听并处理这个异步事件。在这个处理器中,我们将调用自定义函数来完成实际的OSS上传逻辑。
add_action('async_upload_to_oss', 'async_upload_to_oss_handler');
function async_upload_to_oss_handler($args) {
$attachment_id = $args['attachment_id'];
$meta = wp_get_attachment_metadata($attachment_id);
$file_path = get_attached_file($attachment_id);
// 手动触发 oss_upload_attachments 和 oss_upload_thumbs,上传到oss的方法请自行实现
oss_upload_attachments($meta); // 上传原图
oss_upload_thumbs($meta); // 上传缩略图
}
注意事项:
- 该方法利用了 WordPress 的定时任务机制
wp_schedule_single_event
; - 它会在当前请求结束后异步执行上传逻辑,避免阻塞用户请求;
- 不会立即上传到 OSS,但可以显著提升 REST API 响应速度;
- 确保服务器开启了
WP_CRON
,否则需配置真正的 cron job。
替代方案:使用第三方队列系统(高级推荐)
如果你对性能要求较高,建议使用更专业的异步上传方案:
Redis + Worker | 将上传任务推送到 Redis 队列,由独立进程消费上传 |
Amazon SQS / RabbitMQ | 更复杂的微服务架构,适合大型项目 |
WP Background Processing | 使用 WP Background Processing 类库实现轻量级异步任务处理 |
+1