Я пытаюсь получить некоторые данные из веб-службы Вот (ботаническая таксономическая база данных). Сначала я попробовал со стороны клиента (Javascript / AJAX), но получал междоменное ограничение. Затем я переключился на серверную сторону (PHP / cURL), но она не работает, мой сеанс прерывается во время запроса. Я последовал за предложениями Вот, но все равно это не работает.
Что я делаю: я вызываю файл через AJAX, например
getMOBOT.php?genus=Ocotea&sp=guianensis
Файл getMOBOT.php:
<?php
include_once '../../includes_pl/db_connect.php';
include_once '../../includes_pl/functions.php';
sec_session_start();
if (isset($_GET['genus'])) {
$genus = $_GET['genus'];
if (isset($_GET['sp'])) {
$sp = $_GET['sp'];
$curl = curl_init("http://services.tropicos.org/Name/Search?name=$genus+$sp&type=wildcard&apikey=[...]&format=xml");
$curl_response = curl_exec($curl); // error!
curl_close($curl);
echo "It works!";
}
}
?>
Я прочитал, что мне нужно закрыть сеанс (session_write_close ()) перед попыткой curl_exec (где мой сеанс удален), и открыть его позже (session_start ()), но:
1) У меня есть специальная функция для безопасных сессий, которая называется sec_session_start (). Неважно, использую ли я его или сессию по умолчанию session_start () (после curl_exec), ни одна из них не работает.
2) Поскольку в этом файле нет необходимости использовать сессию, я удалил две строки include_once, а также sec_session_start (). Все еще не работает, я просто получаю пустой ответ (HttpReq.readyState == 4, HttpReq.status! = 200 и HttpReq.statusText == »).
3) Если я ввожу URL-адрес в браузере, он работает, что означает, что мой ключ действителен (что я не могу показать здесь, он заменяется […]).
РЕДАКТИРОВАТЬ: изменил строку «curl_exec» для:
if (!curl_exec($curl)) {
die('Erro: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
} else {
echo "It works!";
}
но все равно ничего не получите. Что я делаю не так, пожалуйста?
РЕДАКТИРОВАТЬ 2: я за корпоративный прокси. Может быть, это (опять!) Проблема?
Да, это был прокси (снова)!
Мне нужно было только добавить
$proxy = 'address:port';
$proxyauth = 'user:password';
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyauth);
в нужных местах.
Других решений пока нет …