PHP→ Как сделать HTTP-запрос в скрипте
Сен 7, 2010
обновлено 2022 от IS
HTTP запрос это последовательность команд, заголовков которые обычно посылает ваш браузер когда вы вбиваете необходимую страницу, в ответ на этот запрос вы получаете ответ (response) содержащий либо код ошибки (например 404 или 503), код того что страница перешла на другой адрес ( 301) или код ОК (200) с телом самой страницы. В запросе закодирована много информации таких как «какая информация нужна, какой браузер и тд». Генерируя запрос программой можно получить автоматическую скачку информации с сайта без участия человека и дальнейшего Парсинга данных.
В PHP скриптах, очень часто используется обращение к другим сайтам путем HTTP-запроса. Мне известны несколько способов реализации таких запросов.
Описание используемых методов поверхностное — более полную информацию сможете получить перейдя по ссылкам в статье.
1. Самый простой, но не функциональный.
В качестве файла, в функции file_get_contents(), можно использовать URL-адрес страницы.
Функция в основном используется для файлов, но её также можно применить и для загрузки веб-страниц.
Пример реализации:
$content = file_get_contents('http://ya.ru'); echo $content;
Недостаток этого способа в том, что запрос происходит только через методу GET и нет возможности указать таймаут.
2. Более сложный, но функциональный способ.
Для этого используются сокеты, которые можно применить не только для HTTP-запросов. На сокетах можно реализовать любой запрос, но необходимы знания протокола HTTP и сам метод достаточно сложен для понимания.
Пример реализации:
$socket= fsockopen ("www.yandex.ru", 80, $errno, $errstr, 30); if (!$socket) {echo "$errstr ($errno)";} else { fputs ($socket, "GET / HTTP/1.0\r\nHost: www.yandex.ru\r\n\r\n"); while (!feof($socket)) {echo fgets ($socket,128);} fclose ($socket);}
Преимущество данного способа в том, что можно указать таймаут, метод запроса и полностью контролировать все отправляемые данные — заголовки, POST-данные и т.д.
3. Простой и функциональный способ.
Используя cURL, можно очень просто совершать запросы и при этом есть возможность установить произвольные параметры — такие как таймаут и т.д.
Пример реализации:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://ya.ru'); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $content= curl_exec($ch); curl_close($ch); echo $content;
Способ наиболее простой, но требует библиотеку cURL — обычно она уже предустановлена на веб-сервере.
В своих скриптах я использую cURL, «завернутую» в функцию с уже предустановленными параметрами.
# setcurlcookie function setcurlcookie($setcookie) { global $cookie; if (!empty($setcookie)) {$cookie = $setcookie;}} # curl function curl($url, $post = '', $binary = 0) { global $cookie; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if ($binary == 0) { curl_setopt($ch, CURLOPT_HEADER, 1);} else { curl_setopt($ch, CURLOPT_HEADER, 0);} curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_BINARYTRANSFER, $binary); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); return $result;}
Первая функция setcurlcookie() отвечает за сохранение куков в глобальную переменную.
Благодаря ей, при каждом следующем запросе, куки автоматически будут подставлены из предыдущего запроса.
Вторая функция curl() может осуществлять как GET запросы, так и POST. А также есть возможность указать тип получаемых данных — контент с заголовком или без.
Примеры:
GET-запрос:
$content = curl('http://ya.ru/?search=test'); echo $content;
POST-запрос:
$content = curl('http://ya.ru','username=alex&password=qwerty'); echo $content;
Загрузка файлов:
$content = curl('http://ya.ru/logo.png','',1); echo $content;
Примечание: Информация в статье не исчерпывающая — возможно есть и другие способы.