优化wordpress上传体验:实现异步上传图片到 OSS

为了提升用户体验并加快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

发表回复