http://
https://
http:// -- https:// — Доступ к URL-адресам по протоколу HTTP(s)
Описание
Предоставляет доступ только для чтения файлов/ресурсов через HTTP 1.0, используя метод HTTP GET. Для поддержки name-based виртуальных хостов вместе с запросом посылается заголовок Host:. Если вы сконфигурировали строку user_agent, используя ващ файл php.ini или контекст потока, то она также будет включена в запрос.
Этот поток также позволяет получить доступ к содержимому ресурса; заголовки сохраняются в переменной $http_response_header.
Если важно знать URL, с которого был получен документ (после всех переадресаций, которые были произведены), то вам необходимо обработать серию заголовков ответов, возвращаемых потоком.
INI-директива from будет использоваться для заголовка From:, если установлена и не переопределена в контексте Контекстные опции и параметры.
Использование
- http://example.com
- http://example.com/file.php?var1=val1&var2=val2
- http://user:password@example.com
- https://example.com
- https://example.com/file.php?var1=val1&var2=val2
- https://user:password@example.com
Список изменений
Версия | Описание |
---|---|
4.3.7 | Определение сбойных IIS-серверов для избежания ошибок типа "SSL: Fatal Protocol Error". |
4.3.0 | Добавлен протокол https://. |
4.0.5 | Добавлена поддержка переадресаций. |
Примеры
Пример #1 Определение URL, с которого был забран документ после переадресаций
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {
/* Были ли мы переадресованы? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {
/* Сохранить в $url адрес, куда нас переадресовали */
$url = substr($response, 10);
}
}
?>
Пример #2 Отправка пользовательских заголовков вместе с HTTP-запросом
Пользовательские заголовки могут быть отправлены с использованием опций контекста . Так же можно использовать следующий трюк: Пользовательские заголовки могут быть отправлены с помощью HTTP-запроса за счет использования побочного эффекта в обработке INI-директивы user_agent. Присвойте директиве user_agent любую правильную строку в качестве значения (например, такую как значение по умолчанию - PHP/версия), с последующими символами возврат каретки/перевод на новую строку (CR/LF) и добавьте любые дополнительные заголовки.
<?php
ini_set('user_agent', "PHP\r\nX-MyCustomHeader: Foo");
$fp = fopen('http://www.example.com/index.php', 'r');
?>
Резултаты предыдущего запроса получаются такие:
GET /index.php HTTP/1.0 Host: www.example.com User-Agent: PHP X-MyCustomHeader: Foo
Примечания
Замечание: Протокол HTTPS поддерживается только когда расширение openssl включено.
Соединения HTTP предназначены только для чтения; запись данных или копирование файлов в HTTP-ресурс не поддерживается.
Отправка запросов POST и PUT, например, может быть выполнена с помощью HTTP-контеста.
Смотрите также
- Опции контекста HTTP
- $http_response_header
- stream_get_meta_data() - Извлекает заголовок/метаданные из потоков/файловых указателей
- Функция file://() - Доступ к локальной файловой системе
- Функция http://() - Доступ к URL-адресам по протоколу HTTP(s)
- Функция ftp://() - Доступ к URL-адресам по протоколу FTP(s)
- Функция php://() - Доступ к различным потокам ввода-вывода
- Функция zlib://() - Сжатые потоки
- Функция data://() - Схема Data (RFC 2397)
- Функция glob://() - Нахождение путей, соответствующих шаблону
- Функция phar://() - PHP архив
- Функция ssh2://() - Secure Shell 2
- Функция rar://() - RAR
- Функция ogg://() - Аудио потоки
- Функция expect://() - Потоки для взаимодействия с процессами
Коментарии
As it says on this page:
"The stream allows access to the body of the resource; the headers are stored in the $http_response_header variable. Since PHP 4.3.0, the headers are available using stream_get_meta_data()."
This one sentence is the only documentation I have found on the mysterious $http_response_header variable, and I'm afraid it's misleading. It implies that from 4.3.0 onward, stream_get_meta_data() ought to be used in favor of $http_response_header.
Don't be fooled! stream_get_meta_data() requires a stream reference, which makes it ONLY useful with fopen() and related functions. However, $http_response_header can be used to get the headers from the much simpler file_get_contents() and related functions, which makes it still very useful in 5.x.
Also note that even when file_get_contents() and friends fail due to a 4xx or 5xx error and return false, the headers are still available in $http_response_header.
HTTP post function;
<?php
function post_it($datastream, $url) {
$url = preg_replace("@^http://@i", "", $url);
$host = substr($url, 0, strpos($url, "/"));
$uri = strstr($url, "/");
$reqbody = "";
foreach($datastream as $key=>$val) {
if (!empty($reqbody)) $reqbody.= "&";
$reqbody.= $key."=".urlencode($val);
}
$contentlength = strlen($reqbody);
$reqheader = "POST $uri HTTP/1.1\r\n".
"Host: $host\n". "User-Agent: PostIt\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: $contentlength\r\n\r\n".
"$reqbody\r\n";
$socket = fsockopen($host, 80, $errno, $errstr);
if (!$socket) {
$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $reqheader);
while (!feof($socket)) {
$result[] = fgets($socket, 4096);
}
fclose($socket);
return $result;
}
?>
Passing authentication information in the URL as in "https://user:password@example.com" works for HTTP "Basic" access authentication but not for HTTP "Digest" access authentication. You can use the cURL functions for servers requesting HTTP "Digest" access authentication.