近两周Woocommerce REST API多站点同时失效,代码调用返回500错误
故障原因排查方向
- API响应非预期类型导致致命错误:你当前代码未对
$woocommerce->get()的返回结果做类型校验,直接调用count()处理。如果请求触发目标站点的速率限制、WAF拦截、IP黑名单规则,API会返回错误对象、空值或者非数组格式的响应,此时count()会抛出PHP致命错误,直接导致进程终止返回500。你循环中对同一页请求执行了2次(一次判断count、一次合并数组),高频请求极容易触发限流,这也是两周前突然批量失效的常见诱因——目标站点大概率同期上线了安全规则/限流策略,你的所有部署服务器的IP段刚好命中拦截规则,而其他测试站点的请求源未被拦截所以运行正常。 - PHP内存超限:你将全量商品数据存入
$woo_all_products数组,如果近两周站点商品数量新增较多,数组占用内存超过php.ini中memory_limit的配置阈值,PHP进程会被系统强制终止返回500。其他测试站点商品数量少就不会触发该问题。 - TLS/SSL验证失败:如果目标站点近两周升级了TLS版本、更换了SSL证书,你使用的WooCommerce REST Client底层依赖的cURL配置未兼容新的证书规则/TLS版本,会导致请求失败返回错误内容,未做错误处理就会触发后续逻辑报错。Postman测试正常是因为Postman内置的根证书库和TLS兼容规则更完善。
修复方案
先按如下代码调整逻辑,加入错误校验和请求优化,调试时可打开注释的调试代码查看具体错误原因:
use Automattic\WooCommerce\Client; $url_API_woo = 'https://midominion.com'; $ck_API_woo = 'ck_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; $cs_API_woo = 'cs_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; $woocommerce = new Client( $url_API_woo, $ck_API_woo, $cs_API_woo, [ 'version' => 'wc/v3', // 调试时可以临时关闭SSL验证,排查证书问题,生产环境请删除该行 'verify_ssl' => false ]); // 临时调高内存限制,避免内存不足 ini_set('memory_limit', '1024M'); $page = 1; $woo_all_products = []; // 必须初始化数组,避免array_merge参数报错 while (true) { // 单次请求存储结果,避免重复请求触发限流 $products = $woocommerce->get('products', ['per_page' => 100, 'page' => $page]); // 校验响应格式,非数组直接终止 if (!is_array($products) || empty($products)) { // 调试时打开下方注释,查看返回的错误内容 // var_dump($products); exit; break; } $woo_all_products = array_merge($woo_all_products, $products); $page++; // 增加请求间隔,避免触发速率限制 usleep(300000); // 0.3秒间隔,可根据实际情况调整 }
调整后如果还是报错,可根据调试打印的$products内容进一步定位:如果返回429错误就是触发了限流,需要调整请求间隔;如果返回403错误就是IP被拦截,需要将部署服务器IP加入目标站点安全插件的白名单;如果返回SSL相关错误就是证书验证问题,可更新服务器的根证书库解决。
内容的提问来源于stack exchange,提问作者icortazar
相关产品推荐
相关产品推荐

