如何通过 WooCommerce Rest API 发送大量产品

问题描述 投票:0回答:1

我正在为 WordPress 开发一个插件。我正在从第三方 API 接收产品,但是当我向 WooCommerce REST API 发送请求时,我收到内部服务器错误或 WooCommerce HTTP 客户端错误。有些产品已导入,但随后导入过程会在 WooCommerce 中停止。每次我手动重启插件就可以完整导入产品。 我正在使用批处理

对此最好的解决方案是什么?

    $createChunks = array_chunk($creates, 90);
    foreach ($createChunks as $chunk) {
    $this->woocommerce->post('products/batch', ['create' => $chunk]);
    sleep(2);
    

我使用的是批处理,超时为2秒,内存大小增加到512M,脚本执行时间为3600。 我也在使用 hetzner 托管。

wordpress woocommerce import product woocommerce-rest-api
1个回答
0
投票

听起来您遇到了一些与 API 速率限制、服务器资源限制或插件中的潜在错误相关的潜在问题。这是解决和解决这些问题的结构化方法:

API 速率限制和服务器资源

  • 速率限制:WooCommerce 或第三方 API 可能有速率限制。超过这些限制可能会导致内部服务器错误。查看这两个 API 的速率限制并确保您的请求保持在这些限制之内。

  • 服务器资源:虽然您增加了内存和执行时间,但请确保服务器本身没有处于重负载状态,并且其他配置(如 max_execution_time、max_input_vars 等)适合您的需求。

错误处理和日志记录

  • 错误处理:实施详细的错误日志记录以捕获错误的确切性质。这可以帮助查明问题是与 API 请求还是其他原因有关。

    尝试{ $response = $this->woocommerce->post('产品/批次', ['create' => $chunk]); 如果 (is_wp_error($response)) { error_log('WooCommerce API 错误:' . $response->get_error_message()); } 别的 { error_log('WooCommerce API 响应:' .print_r($response, true)); } } catch (异常$e) { error_log('异常:' . $e->getMessage()); }

批量处理和块大小

  • 块大小:块大小 90 可能太大。尝试减小块大小,看看较小的批次处理是否更可靠。有时,服务器可能会难以应对更大的有效负载。

  • 限制:确保请求之间有足够的限制。根据服务器负载和速率限制,2 秒的睡眠时间可能仍然太短。考虑增加此延迟,看看是否可以提高稳定性。

网络和超时问题

  • 网络问题:确保您的服务器和 WooCommerce 之间不存在与网络相关的问题。检查是否有任何可能干扰的防火墙或网络策略。

  • 超时:即使脚本执行时间为 3600 秒,间歇性网络问题或服务器负载也可能会导致超时。考虑对失败的请求实施指数退避重试。

API客户端库

  • 库问题:如果您使用的是 WooCommerce API 客户端库,请确保它是最新的。有时,库中的错误可能会导致意外问题。

服务器和插件配置

  • 插件冲突:确保与其他插件没有冲突。禁用其他插件看看问题是否仍然存在。
  • WooCommerce 和 WordPress 版本:确保您运行的是 WooCommerce 和 WordPress 的兼容版本。有时,如果版本不匹配,API 更改可能会导致问题。

检查服务器日志

  • 服务器日志:查看服务器日志(Apache/Nginx 错误日志、PHP 错误日志)以获取其他线索。有时,内部服务器错误 (500) 会被记录并包含更多详细信息。

咨询托管支持

  • 托管支持:由于您使用的是 Hetzner 托管,请联系他们的支持团队。他们可能会针对您的托管环境提供可能导致问题的见解或解决方案。

修订后的批处理代码示例

$createChunks = array_chunk($creates, 50); // Reducing chunk size
foreach ($createChunks as $chunk) {
    try {
        $response = $this->woocommerce->post('products/batch', ['create' => $chunk]);
        if (is_wp_error($response)) {
            error_log('WooCommerce API Error: ' . $response->get_error_message());
            continue; // Skip to the next chunk
        }
        error_log('Successfully imported chunk');
    } catch (Exception $e) {
        error_log('Exception: ' . $e->getMessage());
    }
    sleep(5); // Increasing delay
}
© www.soinside.com 2019 - 2024. All rights reserved.