2011-11-02 62 views
2

看起來像curl_setopt_array不同於多個調用curl_setopt。考慮一下這個腳本:如果使用curl_setopt_array設置CURLOPT_POST,PHP curl會重置content-length?

$ch = curl_init('http://www.stackoverflow.com/'); 

[options] 

curl_exec($ch); 

var_dump(curl_getinfo($ch)); 

現在它發送一個適當的請求,如果[options]是其中之一:

curl_setopt_array($ch, array(
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => array('a' => 'b'), 
)); 

curl_setopt_array($ch, array(
    CURLOPT_POSTFIELDS => array('a' => 'b'), 
)); 

curl_setopt($ch, CURLOPT_POSTFIELDS, 'a=b'); 
curl_setopt($ch, CURLOPT_POST, 1); 

BUT不是這樣:

curl_setopt_array($ch, array(
    CURLOPT_POSTFIELDS => array('a' => 'b'), 
    CURLOPT_POST => true, 
)); 

看來,如果CURLOPT_POSTCURLOPT_POSTFIELDS後設置的內容長度復位。除非設置爲curl_setopt而不是curl_setopt_array,否則不起作用。

這是爲什麼?

+0

優秀的工作跟蹤下來。現在,我可以停止將我的頭撞到牆上,並通過Facebook的API上傳照片。 – grossvogel

回答

2

當您指定CURLOPT_POST時,該帖子將作爲application/x-www-form-urlencoded發送。

但是,從curl_setopt手冊頁面:

將數組傳遞給CURLOPT_POSTFIELDS將編碼的數據作爲 的multipart/form-data的,同時使一個URL編碼的字符串將編碼 該數據作爲應用/的X WWW窗體-urlencoded。

所以,當你做

curl_setopt_array($ch, array(
    CURLOPT_POSTFIELDS => array('a' => 'b'), // multipart/form-data 
    CURLOPT_POST => true,      // application/x-www-form-urlencoded 
)); 

的數據被設置爲mulpart/form-data(通過設置CURLOPT_POSTFIELDS到一個數組),然後重新設置爲application/x-www-form-urlencoded(通過設置CURLOPT_POST爲true)。

其他示例的工作原理是,一旦設置了數據,就不會更改類型。

+0

但是當我用'curl_setopt'(最後一個例子)做同樣的工作時,它爲什麼會起作用? – Fluffy

+0

因爲這兩個選項都將類型設置爲'application/x-www-form-urlencoded',所以數據不會丟失 –

+0

哦,我明白了,我的不好。在這一點上,我認爲最好是完全省略'CURLOPT_POST',數據類型將根據post字段設置。那是對的嗎? – Fluffy