PHP → Как сделать HTTP-запрос в скрипте

Сен 7, 2010


В 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;

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

Post to Twitter

Похожие статьи:

  1. Сервис автоактиваций по e-mail

Комментарии (2)

  1. avatar

    Alex
    Февраль 8th, 2011 at 09:24 #

    file_get_contents может отправлять и post запросы.
    Для этого нужно использовать менеджер контекста.
    См. например мануал php или статью на хабре http://habrahabr.ru/blogs/php/48726/

  2. avatar

    GlooK
    Февраль 8th, 2011 at 11:12 #

    Прикольно, не знал. Спасибо)

Ваш комментарий

Rambler's Top100 Яндекс.Метрика