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;

Примечание: Информация в статье не исчерпывающая — возможно есть и другие способы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *