fopen

(PHP 3, PHP 4, PHP 5)

fopen -- 開啟檔案或是 URL

說明

resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )

fopen()filename 特殊的名字資源綁定到一個流上。若果 filename 是 "scheme://..." 的格式,則被當成一個 URL,PHP 將搜尋協定處理器(也被稱為封裝協定)來處理此模式。若果該協定尚未註冊封裝協定,PHP 將發出一條訊息來說明檢查腳本中潛在的問題並將 filename 當成一個普通的檔案名繼續執行下去。

若果 PHP 認為 filename 特殊的是一個本地檔案,將嘗試在該檔案上開啟一個流。該檔案必須是 PHP 可以訪問的,因此需要確認檔案訪問權限容許該訪問。若果啟動了安全模式或是 open_basedir 則會套用進一步的限制。

若果 PHP 認為 filename 特殊的是一個登記的協定,而該協定被註冊為一個網路 URL,PHP 將檢查並確認 allow_url_fopen 已被啟動。若果關閉了,PHP 將發出一個警示,而 fopen 的呼叫則失敗。

注: 所支援的協定清單見附錄 M。某些協定(也被稱為 wrappers)支援 context 和/或 php.ini 選項。參見相應的頁面哪些選項可以被設定(例如 php.ini 中用於 http wrapper 的 user_agent 值)。

注: 對 context 的支援是 PHP 5.0.0 增加的。有關 context 的說明見參考 CXLV, Stream Functions

注: 自 PHP 4.3.2 起,對所有區別二進位和文字模式的平台預設模式都被設為二進位模式。若果在升級後腳本碰到問題,嘗試暫時使用 't' 旗標,直到所有的腳本都照以下所說的改為更具移植性以後。

mode 參數指定了所要求到該流的訪問類型。可以是以下:

表格 1. fopen()mode 的可能值清單

mode說明
'r' 唯讀模式開啟,將檔案指標指向檔案頭。
'r+' 讀寫模式開啟,將檔案指標指向檔案頭。
'w' 寫入模式開啟,將檔案指標指向檔案頭並將檔案大小截為零。若果檔案不存在則嘗試建立之。
'w+' 讀寫模式開啟,將檔案指標指向檔案頭並將檔案大小截為零。若果檔案不存在則嘗試建立之。
'a' 寫入模式開啟,將檔案指標指向檔案末尾。若果檔案不存在則嘗試建立之。
'a+' 讀寫模式開啟,將檔案指標指向檔案末尾。若果檔案不存在則嘗試建立之。
'x' 建立並以寫入模式開啟,將檔案指標指向檔案頭。若果檔案已存在,則 fopen() 呼叫失敗並返回 FALSE,並建立一條 E_WARNING 層級的錯誤訊息。若果檔案不存在則嘗試建立之。這和給 底層的 open(2) 系統呼叫指定 O_EXCL|O_CREAT 旗標是等價的。此選項被 PHP 4.3.2 以及以後的版本所支援,僅能用於本地檔案。
'x+' 建立並以讀寫模式開啟,將檔案指標指向檔案頭。若果檔案已存在,則 fopen() 呼叫失敗並返回 FALSE,並建立一條 E_WARNING 層級的錯誤訊息。若果檔案不存在則嘗試建立之。這和給 底層的 open(2) 系統呼叫指定 O_EXCL|O_CREAT 旗標是等價的。此選項被 PHP 4.3.2 以及以後的版本所支援,僅能用於本地檔案。

注: 不同的動作系統家族具有不同的行結束習慣。當寫入一個文字檔案並想插入一個新行時,需要使用符合動作系統的行結束符號。基於 Unix 的系統使用 \n 作為行結束字元,基於 Windows 的系統使用 \r\n 作為行結束字元,基於 Macintosh 的系統使用 \r 作為行結束字元。

若果寫入檔案時使用了錯誤的行結束符號,則其它套用程式開啟這些檔案時可能會表現得很怪異。

Windows 下提供了一個文字轉換旗標('t')可以透明地將 \n 轉換為 \r\n。與此對應還可以使用 'b' 來強制使用二進位模式,這樣就不會轉換資料。要使用這些旗標,要麼用 'b' 或是用 't' 作為 mode 參數的最後一個字元。

預設的轉換模式依賴於 SAPI 和所使用的 PHP 版本,因此為了便於移植鼓勵總是指定恰當的旗標。若果是動作純文字檔案並在腳本中使用了 \n 作為行結束符,但還要期望這些檔案可以被其它套用程式例如 Notepad 讀取,則在 mode 中使用 't'。在所有其它情況下使用 'b'

在動作二進位檔案時若果沒有指定 'b' 旗標,可能會碰到一些奇怪的問題,內含壞掉的圖片檔案以及關於 \r\n 字元的奇怪問題。

注: 為移植性考慮,強烈建議在用 fopen() 開啟檔案時總是使用 'b' 旗標。

注: 再一次,為移植性考慮,強烈建議你重寫那些依賴於 't' 模式的代碼使其使用正確的行結束符並改成 'b' 模式。

若果也需要在 include_path 中搜尋檔案的話,可以將可選的第三個參數 use_include_path 設為 '1' 或 TRUE

若果開啟失敗,本函數返回 FALSE

例子 1. fopen() 例子

<?php
$handle 
fopen("/home/rasmus/file.txt""r");
$handle fopen("/home/rasmus/file.gif""wb");
$handle fopen("http://www.example.com/""r");
$handle fopen("ftp://user:password@example.com/somefile.txt""w");
?>

若果在用伺服器模組版本的 PHP 時在開啟和寫入檔案上遇到問題,記住要確保所使用的檔案是伺服器程式所能夠訪問的。

在 Windows 平台上,要小心轉義檔案路徑中的每個反斜線,或是用斜線。

<?php
$handle 
fopen("c:\\data\\info.txt""r");
?>

警示

當使用 SSL 時,Microsoft IIS 將違反協定不傳送 close_notify 旗標就關閉連線。PHP 將在到達資料尾端時報告 "SSL: Fatal Protocol Error"。要繞過此問題,應將 error_reporting 層級降低為不內含警示。PHP 4.3.7 及更高版本可以在當使用 https:// 封裝協定開啟流的時候檢驗出有此問題的 IIS 伺服器並抑制警示。若果使用 fsockopen() 來建立一個 ssl:// 套接字,則需要自己檢驗並抑制警示訊息。

注: 安全模式被啟動時,PHP 將檢查被動作的目錄是否和正在執行的腳本有相同的 UID(所有者)。

參見附錄 Mfclose()fgets()fread()fwrite()fsockopen()file()file_exists()is_readable()stream_set_timeout()popen()