2012-03-27 69 views
4

我有一些代码,我试图重用curl上下文来执行放置请求并获取请求。经过各放置请求GET请求失败,此PHP警告:如何在PHP中执行PUT请求后重新使用cUrl上下文?

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

我可以使用PHP shutup运营商,但我宁愿正确地重置卷曲上下文。有谁知道如何做到这一点?我也可以使用不同的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

对不起。在我为此问题键入的快速伪代码中犯了一个错误。我的意思是CURLOPT_HTTPGET,而不是CURLOPT_GET。 – razzard 2012-03-28 16:52:44

回答

0

可以使用上下文

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

设置一个值为CURLOPT_INFILE,然后curl_exec,然后关闭CURLOPT_INFILE文件句柄,接下来curl_exec调用会抱怨CURLOPT_INFILE资源已经消失。 我觉得razzard正在问如何在PUT之后重复使用相同的句柄,并且你没有回答这个问题。 – 2013-04-02 10:57:10

1

FCLOSE($ FH)经过简单的使用curl_setopt_array不是重新的,做curl_setopt($ curlContext,CURLOPT_INFILE,STDIN);

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

1

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

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