PHP curl сбрасывает длину контента, если CURLOPT_POST задано с curl_setopt_array?

Похоже, curl_setopt_array отличается от нескольких вызовов curl_setopt . Рассмотрим этот скрипт:

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

НО НЕ:

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

Кажется, что длина контента сбрасывается, если CURLOPT_POST устанавливается после CURLOPT_POSTFIELDS . За исключением того, что он работает нормально, если задано с curl_setopt вместо curl_setopt_array .

Почему это?

Solutions Collecting From Web of "PHP curl сбрасывает длину контента, если CURLOPT_POST задано с curl_setopt_array?"

Когда вы указываете CURLOPT_POST , сообщение отправляется как application/x-www-form-urlencoded .

Но, с справочной страницы curl_setopt :

Передача массива в CURLOPT_POSTFIELDS будет кодировать данные как multipart / form-data, в то время как передача строки с кодировкой URL будет кодировать данные как application / x-www-form-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).

Другие примеры работают, потому что вы не меняете тип после установки данных.