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');
?>
