cURL - если запрещено allow_url_fopen (PHP)
Если нужно работать с каким-либо внешним источником данных, а функции вида file_get_contents не работают из-за запрета allow_url_fopen, то можно попробовать воспользоваться расширением cURL. Его применение рассмотрим на примере работы с Яндекс.XML.
При работе на реальном хостинге часто можно столкнуться с теми или иными ограничениями, и одно из них - запрет allow_url_fopen, таким образом, воспользоваться "волшебной" функцией file_get_contents для получения информации с какого-то внешнего ресурса не получится. Однако вполне вероятно, что будет доступно расширение cURL, с помощью которого можно решить аналогичную задачу, при этом поддерживаются, в том числе, POST-параметры.
Однажды мне пришлось решать задачу выполнения запроса к сервису Яндекс.XML (при этом хостинг как раз обладал вышеозначенными характеристиками), который еще к тому же требует передачи параметров через POST. Итак, при использовании cURL задачу можно решить следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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
), но данной заметкой я хотел продемонстрировать относительно простой пример работы с этим расширением.
Категория: Программирование, веб | Опубликовано 12.01.2012 | Редакция от 29.01.2017
Похожие материалы
Веб-сервер на FreeBSD с использованием клеток
Здесь вам не Докер, а клетки (jails) - будем говорить, это контейнеры FreeBSD, когда это еще не было мейнстримом (на минуточку, они появились еще во FreeBSD 4.x - 2000 год). Практический смысл в моем случае - неким образом изолированно использовать разные версии PHP, ну и чуть ближе познакомиться с технологией, с которой я уже сталкивался при обзоре TrueNAS. Основано, как говорится, на реальных событиях - я переносил сайты на Drupal 7.x и Yii с сервера на Linux.
FreeBSD на VPS
Продолжаю устанавливать что-нибудь этакое на VPS. На сей раз решил, так сказать, вернуться к истокам - ведь когда-то многие веб-сервера были на фряхе, а также посмотреть, насколько она компактна сама по себе и в плане ресурсоемкости.
Чтение XML в PHP
В статье рассматриваются основы работы с объектами типа XMLReader.