我有一些代码,我正在尝试重用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);
感谢。
答案 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);