PHP Curl发送PUT请求执行到curl_exec时停止无报错如何解决
核心问题原因
你使用的CURLOPT_PUT配置项是为文件流上传设计的,启用后curl会等待读取CURLOPT_INFILE指定的输入流,你未配置该参数,所以程序会卡在curl_exec阶段等待输入,无报错也无返回。
修复方案
将CURLOPT_PUT替换为自定义请求方法配置即可,修改后的完整代码如下:
public function updateProduct($product) { $id = $product->{"id"}; $sku = $product->{"sku"}; $infiniteInventory = $product->{"infiniteInventory"}; $images = $product->{"images"}; $category = $product->{"category"}; $adaptivePrice = $product->{"adaptivePrice"}; $manualPrice = $product->{"manualPrice"}; $url = "https://system-url.de/myId/products/".$id; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); // 替换原CURLOPT_PUT配置 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 新增超时配置,避免程序无限制卡住 curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); $headers = array( "Authorization: Bearer ".$this->getToken(), "Content-Type: application/json", ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $obj = [ "sku"=> $sku, "title"=> [ "de_DE"=> "Claude" ], "infiniteInventory"=> $infiniteInventory, "images"=> $images, "category"=> $category, "adaptivePrice"=> $adaptivePrice, "manualPrice"=> $manualPrice ]; $obj = json_encode($obj); // 新增JSON编码校验,避免非法数据导致请求失败 if (json_last_error() !== JSON_ERROR_NONE) { var_dump("JSON编码错误:".json_last_error_msg()); return; } curl_setopt($curl, CURLOPT_POSTFIELDS, $obj); // 调试用配置,生产环境建议删除 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); // 新增Curl错误捕获,方便定位问题 if(curl_errno($curl)){ var_dump("Curl请求错误:".curl_error($curl)); } curl_close($curl); var_dump($resp); return; }
注:原代码中通过HEREDOC定义的
$data变量未被使用,可直接删除。
其他排查项
- 确认
$this->getToken()返回的鉴权token与reqbin平台使用的一致,无权限问题 - 确认本地网络可正常访问目标接口域名,不存在防火墙、代理拦截
- 若目标接口配置了IP白名单,需将本地出口IP加入白名单
内容的提问来源于stack exchange,提问作者Grimclaw Draven
相关产品推荐
相关产品推荐

