Похоже, 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 .
Почему это?
Когда вы указываете 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).
Другие примеры работают, потому что вы не меняете тип после установки данных.