我正在为 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 托管。
听起来您遇到了一些与 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客户端库
服务器和插件配置
检查服务器日志
咨询托管支持
修订后的批处理代码示例
$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
}