Если нужно работать с каким-либо внешним источником данных, а функции вида file_get_contents не работают из-за запрета allow_url_fopen, то можно попробовать воспользоваться расширением cURL. Его применение рассмотрим на примере работы с Яндекс.XML.

При работе на реальном хостинге часто можно столкнуться с теми или иными ограничениями, и одно из них - запрет allow_url_fopen, таким образом, воспользоваться "волшебной" функцией file_get_contents для получения информации с какого-то внешнего ресурса не получится. Однако вполне вероятно, что будет доступно расширение cURL, с помощью которого можно решить аналогичную задачу, при этом поддерживаются, в том числе, POST-параметры.

Однажды мне пришлось решать задачу выполнения запроса к сервису Яндекс.XML (при этом хостинг как раз обладал вышеозначенными характеристиками), который еще к тому же требует передачи параметров через POST. Итак, при использовании cURL задачу можно решить следующим образом:

$url = 'http://xmlsearch.yandex.ru/xmlsearch?user='. $username .'&key='. $yand_key;
$req = '<request><query>'. $query .'</query></request>';
$req_xml = simplexml_load_string($req);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/xml"));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req_xml->asXML());
curl_setopt($ch, CURLOPT_POST, true);
$response = curl_exec($ch);
curl_close($ch);

Итак, $username и $yand_key - имя пользователя и ключ для Яндекса, $query - поисковый запрос. С помощью simpexml мы формируем "правильную" xml-строку для передачи ее в качестве параметра Яндексу. Наконец, самое главное - инициализируем переменную $ch, с помощью которой мы и получим вожделенный результат.

После инициализации необходимо установить ряд параметров (функцией curl_setopt), среди которых наиболее интересные:

  • CURLOPT_RETURNTRANSFER - чтобы мы "забрали" содержимое в переменную (иначе оно просто выведется на экран);
  • CURLOPT_POSTFIELDS - как раз наш запрос в виде POST-параметра. В общем случае сюда скорее всего наиболее удобно передавать ассоциативный массив: ключ (параметр) - значение.

Остальные параметры, на мой взгляд, довольно очевидные. Функцией curl_exec мы, собственно, и получаем то, что нам нужно, после чего желательно освободить наш ресурс функцией curl_close. Чтобы убедиться, что все в порядке, необходимо выполнить проверку вида if ($response !== false). Далее задача сводится к XML-парсингу, который можно выполнить, например, с помощью объекта XMLReader, и за рамки заметки это уже выходит.

Надо сказать, что возможности cURL весьма и весьма широки (для того, чтобы в этом убедиться, достаточно открыть справку по той же функции curl_setopt), но данной заметкой я хотел продемонстрировать относительно простой пример работы с этим расширением.


Категория: Программирование, 1С | Опубликовано 12.01.2012 | Редакция от 29.01.2017

Похожие материалы:


Комментарии, обсуждение

комментарии простроенны на платформе Disqus