【问题标题】:how to Reusing a cUrl context after doing a PUT request in PHP?在 PHP 中执行 PUT 请求后如何重用 cUrl 上下文?
【发布时间】:2012-04-11 09:48:36
【问题描述】:

我有一些代码试图重用 curl 上下文来执行 put 请求和 get 请求。每次 put 请求后,get 请求都会失败,并显示以下 PHP 警告:

curl_exec(): CURLOPT_INFILE 资源已消失,正在重置为默认值

我可以使用 PHP 的shutup 操作符,但我宁愿正确地重置 curl 上下文。有谁知道如何做到这一点?我也可以使用不同的 curl 上下文,但我宁愿重用连接,因为应用程序正在发送大量请求。我可以保持文件句柄打开,但这似乎是一个 hackish 解决方案,特别是因为这都包含在函数中,所以我可以调用 doPutdoGet 等 p>

$curlContext = curl_init();
$fh = fopen('someFile.txt', 'rw');
curl_setopt($curlContext, CURLOPT_URL, $someUrl);
curl_setopt($curlContext, CURLOPT_PUT, TRUE);
curl_setopt($curlContext, CURLOPT_INFILE, $fh);
curl_setopt($curlContext, CURLOPT_INFILESIZE, $size);
$curl_response1 = curl_exec($curlContext);
fclose($fh);
curl_setopt($curlContext, CURLOPT_PUT, FALSE);
curl_setopt($curlContext, CURLOPT_HTTPGET, TRUE);
curl_setopt($curlContext, CURLOPT_URL, $someOtherUrl);
$curl_response1 = curl_exec($curlContext);

谢谢。

【问题讨论】:

  • 对不起。在我为这个问题输入的快速伪代码中犯了一个错误。我的意思是 CURLOPT_HTTPGET,而不是 CURLOPT_GET。

标签: php curl


【解决方案1】:

从 PHP 5.5 开始,curl_reset 可用于重置所有先前设置的选项。

对于

【讨论】:

    【解决方案2】:

    在fclose($fh)之后,做curl_setopt($curlContext, CURLOPT_INFILE, STDIN);

    将避免“CURLOPT_INFILE 资源已消失,正在重置为默认值”警告。

    【讨论】:

      【解决方案3】:

      您可以简单地使用curl_setopt_array 而不是重新使用上下文

      $file = 'log.txt';
      $fh = fopen($file, 'rw');
      
      $options = array(
              CURLOPT_URL => 'http://localhost/lab/stackoverflow/b.php',
              CURLOPT_PUT => 1,
              CURLOPT_INFILE => $fh,
              CURLOPT_INFILESIZE => filesize($file),
              CURLOPT_HEADER => false
      );
      
      // First Request
      curl_setopt_array($ch = curl_init(), $options);
      echo curl_exec($ch);
      fclose($fh);
      
      // Secound Request
      $options[CURLOPT_URL] = "http://localhost/lab/stackoverflow/c.php";
      unset($options[CURLOPT_INFILE], $options[CURLOPT_INFILESIZE]);
      curl_setopt_array($ch = curl_init(), $options);
      echo curl_exec($ch);
      

      【讨论】:

      • 在为 CURLOPT_INFILE 然后 curl_exec 设置一个值,并关闭 CURLOPT_INFILE 文件句柄后,下一个 curl_exec 调用将抱怨 CURLOPT_INFILE 资源已消失。我认为 razzard 是在询问如何在 PUT 之后重用相同的句柄,而您没有回答这个问题。
      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多