如何在PHP中执行PUT请求后重用cUrl上下文?

时间:2012-03-27 19:56:34

标签: php curl

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

  

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

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

$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);

感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

对于PHP< 5.5,Li-chih Wu的解决方案是一种可能的解决方法。

答案 2 :(得分:0)

您只需使用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);