我有一些代码试图重用curl上下文来执行put请求和get请求。在每个put请求之后,get请求都会失败,并显示以下PHP警告:
curl_exec():CURLOPT_INFILE资源已消失,重置为默认
我可以使用PHP shutup操作符,但我更愿意正确地重置curl上下文。有人知道怎么做吗?我也可以使用不同的curl上下文,但我宁愿重用连接,因为应用程序正在发送大量请求。我可以打开文件句柄,但这似乎是一个棘手的解决方案,尤其是因为这一切都包含在函数中,所以我可以调用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);
谢谢。
从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);