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 处停止的主要内容,如果未能解决你的问题,请参考以下文章

PHP - curl_exec 需要 100 毫秒

php 中 怎么让curl_exec 以数组形式返回

PHP中的curl_exec

php 中 怎么让curl_exec 以数组形式返回

php 用curl_exec 采集页面内容,结果 302重定向

php curl_exec,服务器上开启了这个功能,但是提示无法加载