При работе на реальном хостинге часто можно столкнуться с теми или иными ограничениями, и одно из них - запрет 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
), но данной заметкой я хотел продемонстрировать относительно простой пример работы с этим расширением.