PHP Conference Japan 2024

file_get_contents

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

file_get_contents將整個檔案讀入字串

說明

file_get_contents(
    字串 $filename,
    布林值 $use_include_path = false,
    ?資源 $context = null,
    整數 $offset = 0,
    ?整數 $length = null
): 字串|false

此函式與 file() 類似,不同之處在於 file_get_contents() 會將檔案以 字串 形式返回,從指定的 offset 開始,最多讀取 length 個位元組。失敗時,file_get_contents() 會返回 false

file_get_contents() 是將檔案內容讀入字串的首選方法。如果您的作業系統支援,它將使用記憶體映射技術來提高效能。

注意:

如果您要開啟包含特殊字元(例如空格)的 URI,則需要使用 urlencode() 對 URI 進行編碼。

參數

filename

要讀取的檔案名稱。

use_include_path

注意:

可以使用 FILE_USE_INCLUDE_PATH 常數來觸發 include 路徑 搜尋。如果啟用了 嚴格類型,則無法使用此功能,因為 FILE_USE_INCLUDE_PATH 是一個 整數。請改用 true

context

使用 stream_context_create() 建立的有效上下文資源。如果您不需要使用自訂上下文,則可以透過傳入 null 來略過此參數。

offset

從原始串流開始讀取的偏移量。負偏移量從串流的末尾開始計算。

遠端檔案不支援搜尋 (offset)。嘗試在非本地檔案上搜尋可能適用於小的偏移量,但這是不可預測的,因為它作用於緩衝的串流。

length

讀取資料的最大長度。預設值是讀取到檔案結尾。請注意,此參數應用於篩選器處理的串流。

回傳值

該函式返回讀取的資料,或者在失敗時返回 false

警告

此函式可能會返回布林值 false,但也可能返回評估為 false 的非布林值。請閱讀 布林值 的相關章節以了解更多資訊。使用 === 運算子 來測試此函式的回傳值。

錯誤/例外

如果找不到 filenamelength 小於零,或者在串流中搜尋指定的 offset 失敗,則會產生 E_WARNING 等級的錯誤。

當在目錄上呼叫 file_get_contents() 時,在 Windows 上會產生 E_WARNING 等級的錯誤,從 PHP 7.4 開始,在其他作業系統上也會產生此錯誤。

更新日誌

版本 說明
8.0.0 length 現在可以為 null。
7.1.0 現在已支援負的 offset 值。

範例

範例 #1 取得並輸出網站首頁的原始碼

<?php
$homepage
= file_get_contents('http://www.example.com/');
echo
$homepage;
?>

範例 #2 在 include_path 中搜尋

<?php
// 如果啟用了嚴格類型,例如 declare(strict_types=1);
$file = file_get_contents('./people.txt', true);
// 否則
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);
?>

範例 #3 讀取檔案的某個區段

<?php
// 從第 21 個字元開始讀取 14 個字元
$section = file_get_contents('./people.txt', FALSE, NULL, 20, 14);
var_dump($section);
?>

上述範例將輸出類似以下的內容

string(14) "lle Bjori Ro"

範例 #4 使用串流脈絡

<?php
// 建立串流
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);

$context = stream_context_create($opts);

// 使用上面設定的 HTTP 標頭開啟檔案
$file = file_get_contents('http://www.example.com/', false, $context);
?>

注意事項

注意此函式是二進位安全的。

提示

如果啟用了 fopen 包裝器,則可以使用 URL 作為此函式的檔案名稱。有關如何指定檔案名稱的更多詳細資訊,請參閱 fopen()。有關各種包裝器功能、使用注意事項以及它們可能提供的任何預定義變數的資訊連結,請參閱 支援的協定和包裝器

警告

使用 SSL 時,Microsoft IIS 會違反協定,在不發送 close_notify 指示器的情況下關閉連線。當您讀取到資料結尾時,PHP 會將此報告為「SSL:嚴重協定錯誤」。要解決此問題,應將 error_reporting 的值降低到不包含警告的級別。當您使用 https:// 包裝器開啟串流時,PHP 可以偵測到有問題的 IIS 伺服器軟體,並會抑制警告。當使用 fsockopen() 建立 ssl:// 通訊端時,開發人員有責任偵測並抑制此警告。

另請參閱

新增註釋

使用者貢獻的註釋 5 則註釋

Bart Friederichs
12 年前
file_get_contents 可以執行 POST,先建立一個上下文

<?php

$opts
= array('http' =>
array(
'method' => 'POST',
'header' => "Content-Type: text/xml\r\n".
"Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
'content' => $body,
'timeout' => 60
)
);

$context = stream_context_create($opts);
$url = 'https://'.$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);

?>
KC
1 年前
如果使用負偏移量來擷取檔案結尾,而檔案長度比偏移量短,`file_get_contents()` 將會返回 false。

如果您希望在檔案比負偏移量短時,它只返回可用的部分,您可以再次嘗試。

例如...

`$contents = file_get_contents( $log_file, false, null, -4096 );` // 取得最後 4KB

`if ( false === $contents ) {`
// 可能發生錯誤,或者檔案大小小於 4KB。

`$contents = file_get_contents( $log_file, false, null );`

`if ( false === $contents ) {`
// 處理真正的錯誤。
}
}
brentcontact at daha dot us
1 年前
為了防止混合內容,大多數瀏覽器/函式在您只指定 // 而非 http://https:// 時,會使用已使用的協議。 但 `file_get_contents` 並非如此,您必須指定協議。

以下程式碼無法運作
<?php
$jsonData
= file_get_contents('//example.com/file.json');
print
$jsonData;
?>

只指定 `'example.com/file.json'` 而不使用雙斜線也無法運作。

在 Apache 2.4 上運行時,使用 `$_SERVER['REQUEST_SCHEME']` 是更好的協議不可知寫法 (protocol-agnostic)。
<?php
$jsonData
= file_get_contents($_SERVER['REQUEST_SCHEME'].'://example.com/file.json');
print
$jsonData;
?>

如果使用其他網頁伺服器,您可能需要以其他方式取得協議或將其寫死。
daniel at dangarbri dot tech
1 年前
請注意,如果 HTTP 請求失敗但仍有回應主體,結果仍然是 false,而不是可能包含更多請求失敗詳細資訊的回應主體。
soger
2 年前
這個頁面幾乎沒有提及,但如果您的檔案是連結,`$http_response_header` 將會填入 HTTP 標頭。例如,如果您預期收到一張圖片,您可以這樣做:

<?php
$data
= file_get_contents('https://example.net/some-link');

$mimetype = null;
foreach (
$http_response_header as $v) {
if (
preg_match('/^content\-type:\s*(image\/[^;\s\n\r]+)/i', $v, $m)) {
$mimetype = $m[1];
}
}

if (!
$mimetype) {
// 不是圖片
}
To Top