PHP Conference Japan 2024

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:password@example.com
  • https://example.com
  • https://example.com/file.php?var1=val1&var2=val2
  • https://user:password@example.com

選項

封裝器摘要
屬性 支援
allow_url_fopen 限制
允許讀取
允許寫入
允許附加
允許同時讀取和寫入 不適用
支援 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 資源。

例如,可以使用 HTTP 上下文來發送 *POST* 和 *PUT* 請求。

參見

新增附註

使用者貢獻的附註 3 個附註

7
Rainer Perske
9 年前
在 URL 中傳遞驗證資訊(如 "https://user:password@example.com")適用於 HTTP "基本" 存取驗證,但不適用於 HTTP "摘要" 存取驗證。您可以使用 cURL 函數來處理要求 HTTP "摘要" 存取驗證的伺服器。
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