2024年PHP日本大会

http://

https://

http:// -- https://访问HTTP(s) URL

描述

允许通过HTTP只读访问文件/资源。默认情况下,使用HTTP 1.0 GET。请求中会发送一个Host:头来处理基于名称的虚拟主机。如果您已使用php.ini文件或流上下文配置了user_agent字符串,它也将包含在请求中。

该流允许访问资源的主体;头信息存储在$http_response_header变量中。

如果了解文档来源的资源URL(在处理完所有重定向之后)非常重要,则需要处理流返回的一系列响应头。

如果设置了from指令并且没有被上下文选项和参数覆盖,则它将用于From:头。

用法

  • http://example.com
  • http://example.com/file.php?var1=val1&var2=val2
  • http://user:[email protected]
  • https://example.com
  • https://example.com/file.php?var1=val1&var2=val2
  • https://user:[email protected]

选项

封装器摘要
属性 支持
allow_url_fopen限制
允许读取
允许写入
允许追加
允许同时读写 N/A
支持stat()
支持unlink()
支持rename()
支持mkdir()
支持rmdir()

示例

示例 #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);
}

}

?>

注释

注意: 只有在启用了openssl扩展时才支持HTTPS。

HTTP连接是只读的;不支持将数据写入或将文件复制到HTTP资源。

例如,发送POSTPUT请求可以使用HTTP上下文

参见

添加注释

用户贡献的注释 3条注释

7
Rainer Perske
9年前
在URL中传递身份验证信息,例如 "https://user:[email protected]",适用于HTTP“基本”访问身份验证,但不适用于HTTP“摘要”访问身份验证。对于请求HTTP“摘要”访问身份验证的服务器,可以使用cURL函数。
7
dwalton at acm dot org
18年前
正如本页所述

"该流允许访问资源的主体;头信息存储在$http_response_header变量中。从PHP 4.3.0开始,可以使用stream_get_meta_data()访问头信息。"

这句话是我找到的关于神秘的$http_response_header变量的唯一文档,而且我担心它具有误导性。这意味着从4.3.0开始,应该使用stream_get_meta_data()代替$http_response_header。

不要被骗!stream_get_meta_data()需要一个流引用,这使得它仅适用于fopen()和相关函数。但是,$http_response_header可用于从更简单的file_get_contents()和相关函数获取头信息,这使得它在5.x版本中仍然非常有用。

另请注意,即使file_get_contents()及其相关函数由于4xx或5xx错误而失败并返回false,头信息仍然可在$http_response_header中获得。
0
NEA at AraTaraBul dot com
17年前
HTTP post函数;

<?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;
}
?>
To Top