php curl vs cli curl, отправка xml - PullRequest
3 голосов
/ 22 июля 2011

ОБНОВЛЕНО, СПАСИБО ОТВЕТАМ:

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

$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 в командной строке?

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

Ответы [ 5 ]

4 голосов
/ 22 июля 2011

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

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

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

3 голосов
/ 22 июля 2011

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, чем реализация PHP libcurl.Чтобы исправить это, задайте значение CURLOPT_CAINFO, совпадающее с переменной среды CURL_CA_BUNDLE оболочки, и тогда должна работать проверка равноправия.

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

2 голосов
/ 22 июля 2011

Добавить эту строку:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
2 голосов
/ 22 июля 2011

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

из руководства php: curl_exec Возвращает TRUE в случае успеха или FALSE в случае неудачи.Однако, если установлена ​​опция CURLOPT_RETURNTRANSFER, она вернет результат в случае успеха, FALSE в случае ошибки.

0 голосов
/ 23 июля 2011

Для соответствия версии 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);
...