PHP Curl PUT 在 curl_exec 处停止
Posted
技术标签:
【中文标题】PHP Curl PUT 在 curl_exec 处停止【英文标题】:PHP Curl PUT stopps at curl_exec 【发布时间】:2021-11-16 01:36:28 【问题描述】:我尝试通过 PUT-Request 更新产品,但程序在 curl_exec 处停止执行。 因为我什至没有收到错误或任何东西,我有点迷失在黑暗中。 我使用这个站点生成了代码:https://reqbin.com/ 它适用于我的 GET 和 POST 请求,但 PUT 似乎不起作用。 当我使用该站点发送 PUT-Request 时,它确实有效,但不适用于我的本地工作区。
这是我的代码:
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);
curl_setopt($curl, CURLOPT_PUT, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$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);
$data = <<<DATA
$obj
DATA;
curl_setopt($curl, CURLOPT_POSTFIELDS, $obj);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_getinfo($curl);
$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);
return;
【问题讨论】:
使用 curl_error 知道出了什么问题:php.net/manual/en/function.curl-error.php 我现在写了这一行,没有显示任何错误,程序仍然挂起: echo curl_error($curl); $resp = curl_exec($curl);回声 curl_error($curl); “curl_errno”呢?如果没有捕获到错误,则响应没有负载。 它会停止,直到请求完成,这很明显。如果远程端没有及时响应,您的代码可能看起来“挂起”,但这是一种误解。接收代码是什么?请提供minimal reproducible example! @Ma'moonAl-Akash 我也试过了,但我的代码挂在 exec 上,我在 exec 之前和之后都没有返回错误。 【参考方案1】:尝试像这样卷曲:
<?php
$url = "https://system-url.de/myId/products/".$id;
$curl = curl_init();
$obj = [
"sku"=> $sku,
"title"=> [
"de_DE"=> "Claude"
],
"infiniteInventory"=> $infiniteInventory,
"images"=> $images,
"category"=> $category,
"adaptivePrice"=> $adaptivePrice,
"manualPrice"=> $manualPrice
];
$obj = json_encode($obj);
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => $obj,
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer ".$this->getToken()',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
注意它和你的不一样 -- : CURLOPT_CUSTOMREQUEST => 'PUT', or curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
【讨论】:
确实有效,但为什么这里的代码表现如此不同? 有多种方法可以将 curl 转换为 php 我建议使用 Postman 或 Talend Api Test 等... Postman 在上面给了我们这段代码,但是在我复制 curl 和使用:incarnate.github.io/curl-to-php 'PUT',这是正确的行...您使用的行...嗯,我认为这是错误的...以上是关于PHP Curl PUT 在 curl_exec 处停止的主要内容,如果未能解决你的问题,请参考以下文章