You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress调用REST API上传图片偶发超时问题求助

WordPress REST API上传图片间歇性出现curl 52错误的解决方案

从现象和Apache日志来看,问题根源是ImageMagick在处理图片像素缓存时超时被终止——虽然图片已经成功上传到服务器,但WordPress调用media_sideload_image时会触发缩略图生成、元数据提取等操作,这个过程依赖ImageMagick的缓存机制,当缓存操作超时后,Apache直接终止进程,导致REST API无响应,从而出现curl: (52) Empty reply from server错误。

以下是针对性解决方案:

方案1:调整ImageMagick缓存与内存限制

ImageMagick默认缓存配置可能不足以处理较大或批量图片,可通过两种方式调整:

  • 全局配置修改:找到ImageMagick的policy.xml文件(常见路径如/etc/ImageMagick-6/policy.xml或/usr/local/etc/ImageMagick/policy.xml),添加/修改以下配置提升资源上限:
<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="time" value="30s"/>
  • 代码内临时设置:在调用media_sideload_image前,通过PHP设置环境变量,无需修改全局配置:
function pre_upload_image ($url)
{
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    // 临时调整ImageMagick资源限制
    putenv('MAGICK_MEMORY_LIMIT=256MiB');
    putenv('MAGICK_DISK_LIMIT=1GiB');

    $id = media_sideload_image( $url, 0, null, 'id' );

    return $id;
}

方案2:临时提升PHP执行时间

图片处理过程可能超过PHP默认执行时间,针对上传操作单独设置超时:

function pre_upload_image ($url)
{
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    // 保存原执行时间,处理后恢复
    $original_time_limit = ini_get('max_execution_time');
    set_time_limit(60); // 可根据实际情况调整时长

    $id = media_sideload_image( $url, 0, null, 'id' );

    // 恢复原执行时间限制
    set_time_limit($original_time_limit);

    return $id;
}

方案3:异步分离上传与图片处理

既然图片已能成功上传,可将耗时的图片处理逻辑放到WP Cron异步执行,避免API请求超时:

  1. 修改API回调,先记录任务再返回成功:
function pre_import($request = null)
{
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    $error = new WP_Error();

    if(empty($request) ||
        empty($request['token']) ||
        empty($request['miniature']))
    {
        $error->add(400, "Request", array('status' => 400));
        return $error;
    }

    $token = get_option('cmc_liseuse_token_import', '');

    if($request['token'] != $token)
    {
        $error->add(410, "Token", array('status' => 400));
        return $error;
    }

    // 创建异步任务
    $task_data = array(
        'miniature_url' => $request['miniature'],
        'created_at' => time()
    );
    $task_post = wp_insert_post(array(
        'post_type' => 'import_task',
        'post_status' => 'private',
        'post_title' => 'Image Import Task ' . time(),
        'post_content' => json_encode($task_data)
    ));

    if(!$task_post) {
        $error->add(440, "Internal error", array('status' => 400));
        return $error;
    }

    // 触发异步处理
    wp_schedule_single_event(time(), 'process_image_import_task', array($task_post));

    return wp_send_json_success(array('message' => '图片上传任务已提交,将后台处理'));
}
  1. 注册Cron钩子处理图片:
// 注册自定义文章类型存储任务
add_action('init', 'register_import_task_post_type');
function register_import_task_post_type() {
    register_post_type('import_task', array(
        'public' => false,
        'label' => 'Import Tasks',
        'supports' => array('title', 'content')
    ));
}

// 异步任务处理回调
add_action('process_image_import_task', 'process_image_import_task_callback');
function process_image_import_task_callback($task_post_id) {
    $task_post = get_post($task_post_id);
    if(!$task_post) return;

    $task_data = json_decode($task_post->post_content, true);
    $idMiniature = pre_upload_image($task_data['miniature_url']);

    // 更新任务状态
    $updated_data = array_merge($task_data, array(
        'attachment_id' => $idMiniature,
        'status' => is_int($idMiniature) ? 'completed' : 'failed'
    ));
    wp_update_post(array(
        'ID' => $task_post_id,
        'post_content' => json_encode($updated_data)
    ));
}

方案4:切换到GD库处理图片

如果服务器支持GD库,可强制WordPress使用GD代替ImageMagick,绕开ImageMagick缓存问题:
在wp-config.php中添加:

define('WP_IMAGE_EDITOR', 'WP_Image_Editor_GD');

内容的提问来源于stack exchange,提问作者Dylan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:08:08