РНР локон завиток против Кинк, постинга 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 ответов:
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-при неудачном.
Чтобы соответствовать версии 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);