Как отправить запрос GET из PHP?

280

Я планирую использовать PHP для простого требования. Мне нужно загрузить содержимое XML с URL-адреса, для чего мне нужно отправить HTTP-запрос GET на этот URL-адрес.

Как мне это сделать в PHP?

Веера
источник

Ответы:

379

Если вам не нужно больше, чем просто содержимое файла, вы можете использовать file_get_contents.

$xml = file_get_contents("http://www.example.com/file.xml");

Для чего-то более сложного, я бы использовал cURL .

Саша Чедыгов
источник
3
Это правильно, если вам не нужно использовать параметры строки запроса.
Raptor
2
@musicfreak: строка запроса иногда игнорируется некоторыми серверами для настройки безопасности. Кроме того, межсерверный запрос может привести к этой ошибке:failed to open stream: HTTP request failed!
Raptor
26
@ShivanRaptor: Я не уверен, о чем вы говорите ... Строка запроса является лишь частью строки. Нет причины, по которой сервер игнорировал бы это. Теперь, очевидно, file_get_contentsне позволяет вам сделать запрос с помощью пользовательских файлов cookie, заголовков и других вещей, которые обычно отправляет браузер, поэтому вы можете не получить ответ, который искали. В этом случае вам лучше использовать CURL в любом случае. (Но это не случай ОП.)
Саша Чедыгов
1
Curl намного быстрее, чем file_get_contents. Предпочитайте Curl, а не file_get_contents в среде с высоким трафиком
Deb
2
@Sasha - Я сталкивался с этим во многих производственных средах, но вы могли видеть эти ссылки на данный момент: haltiko.blogspot.com/2013/02/… или mdb9.wordpress.com/2011/03/06/…
Deb
132

Для более сложных запросов GET / POST вы можете установить библиотеку CURL ( http://us3.php.net/curl ):

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
Джеймс Скидмор
источник
10
Хотя действительно нет необходимости использовать CURL для «простого требования», +1, потому что это действительно лучшее решение для выполнения чего-то более сложного с HTTP-запросами в PHP.
xyz
Как уже упоминалось, curl намного быстрее, чем file_get_contents(). Простая четырехбуквенная строка заняла около 10 секунд, а скручивание - более 1 секунды.
Питер Гордон
@pgmann Ты уверен в этом результате? это не соответствует другой статистике тому, что было процитировано. Действительно, CURL быстрее, но не должен быть намного быстрее. Может быть, это снижение времени отклика произошло из-за кэширования на сервере какого-либо ресурса и т. Д.? Может быть, стоит повторить тест?
Рауни Лиллемец
1
@Rauni Боюсь, я не могу повторить тестирование, но я всегда использую cURL для увеличения скорости и т. Д. Время запроса является приблизительным, как это было при загрузке страницы. Я пробовал несколько раз.
Питер Гордон
63

http_getдолжен сделать свое дело. Преимущества http_getover file_get_contentsвключают возможность просмотра заголовков HTTP, доступа к деталям запроса и контроля времени ожидания соединения.

$response = http_get("http://www.example.com/file.xml");
Уильям Брендель
источник
83
Расширение http не поставляется вместе с PHP и часто недоступно на общих хостах.
Имран
27
для этого требуется pecl_http> = 0.1.0, который по умолчанию не установлен.
Raptor
5
«Страница справочника, которую вы ищете ( us2.php.net/manual/en/function.http-get.php ), сейчас недоступна на этом сервере».
Панг
20

Помните, что если вы используете прокси-сервер, вам нужно сделать небольшой трюк в своем php-коде:

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>
Pepe
источник
9

В зависимости от того, позволяет ли ваша настройка php открывать URL-адреса, вы также можете просто указать URL с аргументами get в строке (например, http://example.com?variable=value )

Изменить: Перечитывая вопрос, я не уверен, хотите ли вы передать переменные или нет - если вы не можете, просто отправьте запрос fopen, связавшись с http://example.com/filename.xml - не стесняйтесь игнорировать переменную = значение части

Zxaos
источник
5

Мне нравится использовать fsockopen open для этого.

pbreitenbach
источник
5

С другой стороны, использование REST API других серверов очень популярно в PHP. Предположим, вы ищете способ перенаправить некоторые HTTP-запросы на другой сервер (например, получить файл XML). Вот пакет PHP, чтобы помочь вам:

https://github.com/romanpitak/PHP-REST-Client

Итак, получив XML-файл:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
Мостафа
источник
5

Guzzle - очень хорошо известная библиотека, которая позволяет очень легко выполнять всевозможные HTTP-вызовы. Смотрите https://github.com/guzzle/guzzle . Установить с помощью composer require guzzlehttp/guzzleи запустить composer install. Теперь приведенного ниже кода достаточно для вызова http.

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
Марк Баайенс
источник