РНР локон завиток против Кинк, постинга XML


ОБНОВЛЕНО БЛАГОДАРЯ ОТВЕТАМ:

Может ли кто-нибудь указать на разницу между:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_root);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "xml"); // tried http_build_query also
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Added this, still no good
return curl_exec($ch);  // returns false

И:

$curl = "curl -X POST -d 'xml' {$api_root}";
return `$curl`;  // returns expected xml from server

И/ИЛИ

В более общем плане, существуют ли какие-либо хорошие разбивки для преобразования/ссылки между значениями/заголовками libcurl php по умолчанию и значениями / заголовками curl в командной строке?

Я знаю, что это почти обман curl CLI для curl PHP и CLI CURL -> PHP CURL но я надеюсь на что-то большее окончательный.

5 3

5 ответов:

Curl_exec возвращает true или false по умолчанию. Вам нужно указать CURLOPT_RETURNTRANSFER:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Так как curl_exec возвращается false (не NULL, как указано в исходном вопросе) , попробуйте использовать curl_error(), чтобы определить , Почему он возвращает false.

TFM (читай): curl_exec(), curl_setopt()

Редактировать ради потомства:

ОП обнаружил, что проблема SSL была помехой. И то и другое libcurl (как вызывается через PHP)и командная строка curl выполняют одноранговую проверку SSL для каждой транзакции, если пользователь явно не отключает ее.

Вероятный сценарий заключается в том, что среда оболочки использует другой пакет CA, чем реализация libcurl PHP. Чтобы исправить это, установите значение CURLOPT_CAINFO таким же, как переменная окружения оболочки CURL_CA_BUNDLE, и тогда должна работать одноранговая проверка.

@ОП: мне было бы любопытно узнать, подтверждается ли вышеизложенное предположение работает в вашем случае, или если есть что-то другое с конфигурацией SSL.

Когда вы используете backticks, PHP вызывает оболочку. Это может быть опасно, особенно при включении переменных в команду. Если у кого-то есть способ повлиять на значение $api_root, он сможет вызвать любую команду в вашей системе.

Использование API намного безопаснее и, вероятно, быстрее, так как библиотеки curl загружаются в PHP.

Что касается того, почему это не работает, кажется, другие ответили на этот вопрос:)

В вашем примере php вы пропускаете
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

Из руководства php: curl_exec Возвращает TRUE в случае успеха или FALSE в случае неудачи. Однако, если параметр CURLOPT_RETURNTRANSFER установлен, он возвращает результат при успешном выполнении, FALSE-при неудачном.

Добавьте следующую строку:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Чтобы соответствовать версии CLI:

$curl = "curl -X POST -d 'xml' {$api_root}";
return `$curl`;  // returns expected xml from server

Мне также понадобилось:

// Thanks to all the answers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

// This appears to default false on CLI, true in libcurl
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);