http://
https://
访问 HTTP(s)网址
说明
允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。 HTTP 请求会附带一个Host:头,用于兼容基于域名的虚拟主机。如果在你的php.ini文件中或字节流上下文(context)配置了user_agent字符串,它也会被包含在请求之中。
数据流允许读取资源的body,而 headers 则储存在了$http_response_header变量里。
如果需要知道文档资源来自哪个 URL(经过所有重定向的处理后),需要处理数据流返回的系列响应报头(response headers)。
The from directive will be used for theFrom:header if set and not overwritten by the 上下文(Context)选项和参数.
用法
- 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
可选项
属性 | 支持 |
---|---|
受allow_url_fopen限制 | Yes |
允许读取 | Yes |
允许写入 | No |
允许添加 | No |
允许同时读和写 | N/A |
支持stat() | No |
支持unlink() | No |
支持rename() | No |
支持mkdir() | No |
支持rmdir() | No |
更新日志
版本 | 说明 |
---|---|
4.3.7 | 检测 IIS 服务器避免"SSL: Fatal Protocol Error"错误。 |
4.3.0 | 添加https://。 |
4.0.5 | 增加了对重定向的支持。 |
范例
Example #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); } } ?>
注释
Note:openssl扩展启用后才能够支持 HTTPS 协议。
HTTP 连接是只读的;还不支持对一个 HTTP 资源进行写数据或者复制文件。
比如发送POST和PUT请求,可以在HTTP Contexts的支持下实现。
参见
- HTTP context 选项
- $http_response_header
stream_get_meta_data()
从封装协议文件指针中取得报头/元数据
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.
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; } ?>
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.
If you want to send more than one custom header, just make header an array: <?php $default_opts = array( 'http' => array( 'user_agent' => 'Foobar', 'header' => array( 'X-Foo: Bar', 'X-Bar: Baz' ) ) ); stream_context_get_default($default_opts); readfile('http://www.xhaus.com/headers'); ?>