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


how to Reusing a cUrl context after doing a PUT request in PHP?

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

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

我可以使用PHP shutup操作符,但我更愿意正确地重置curl上下文。有人知道怎么做吗?我也可以使用不同的curl上下文,但我宁愿重用连接,因为应用程序正在发送大量请求。我可以打开文件句柄,但这似乎是一个棘手的解决方案,尤其是因为这一切都包含在函数中,所以我可以调用doPutdoGet

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

谢谢。

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

对于PHP<5.5,李的解决方案是一个可能的变通办法。

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

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

您可以简单地使用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);