本文目錄一覽:
- 1、php fopen
- 2、php用fopen,fwrite,fclose等函數將數據寫入文本文件後,如何儲存該數據?
- 3、fopen函數在PHP中怎麼用?求一個完整的例子
- 4、PHP流(Stream)的概述與使用詳解
- 5、php的fopen函數打開文件詳解以及如何打開中
php fopen
一般情況下可以不用fopen,只用file_get_conetents、file_put_contents、file、readfile等函數就可以了,但是使用fopen可以實現更多功能,比如只讀取文件的一部分、添加文件、修改文件的一部分。
建議你現在先別學fopen,使用別的函數完成功能,當有需要的時侯才看fopen,那時侯你就容易明白了。
php用fopen,fwrite,fclose等函數將數據寫入文本文件後,如何儲存該數據?
fopen打開文件資源的時候,mode參數選擇w,w+或a,a+,如果文件不存在,就會自動創建文件
一般情況建議直接使用file_put_contents,會自動打開文件資源,寫入數據並關閉資源,如果文件不存在會自動創建文件,操作也會簡便很多
詳細信息請參看文檔
fopen函數在PHP中怎麼用?求一個完整的例子
打開文件
fopen() 函數用於在 PHP 中打開文件。
此函數的第一個參數含有要打開的文件的名稱,第二個參數規定了使用哪種模式來打開文件:
html
body
?php
$file=fopen(“welcome.txt”,”r”);
?
/body
/html文件可能通過下列模式來打開:
r 只讀。在文件的開頭開始。
r+ 讀/寫。在文件的開頭開始。
w 只寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
w+ 讀/寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
a 追加。打開並向文件文件的末端進行寫操作,如果文件不存在,則創建新文件。
a+ 讀/追加。通過向文件末端寫內容,來保持文件內容。
x 只寫。創建新文件。如果文件以存在,則返回 FALSE。
x+ 讀/寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。
注釋:如果 fopen() 無法打開指定文件,則返回 0 (false)。
例子
如果 fopen() 不能打開指定的文件,下面的例子會生成一段消息:
html
body
?php
$file=fopen(“welcome.txt”,”r”) or exit(“Unable to open file!”);
?
/body
/html
關閉文件
fclose() 函數用於關閉打開的文件。
?php
$file = fopen(“test.txt”,”r”);
//some code to be executed
fclose($file);
?
檢測 End-of-file
feof() 函數檢測是否已達到文件的末端 (EOF)。在循環遍歷未知長度的數據時,feof() 函數很有用。
注釋:在 w 、a 以及 x 模式,您無法讀取打開的文件!
if (feof($file)) echo “End of file”;
逐行讀取文件
fgets() 函數用於從文件中逐行讀取文件。
注釋:在調用該函數之後,文件指針會移動到下一行。
例子
下面的例子逐行讀取文件,直到文件末端為止:
?php
$file = fopen(“welcome.txt”, “r”) or exit(“Unable to open file!”);
//Output a line of the file until the end is reached
while(!feof($file))
{
echo fgets($file). “br /”;
}
fclose($file);
?
逐字元讀取文件
fgetc() 函數用於從文件逐字元地讀取文件。
注釋:在調用該函數之後,文件指針會移動到下一個字元。
例子
下面的例子逐字元地讀取文件,直到文件末端為止:
?php
$file=fopen(“welcome.txt”,”r”) or exit(“Unable to open file!”);
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?
PHP流(Stream)的概述與使用詳解
在現代 PHP 特性中,流或許是最出色但使用率最低的。雖然 PHP 4.3 就引入了流,但是很多開發者並不知道流的存在,因為人們很少提及流,而且流的文檔也很匱乏。PHP 官方文檔對流的解釋如下:
可能看完這段解釋後還是雲里霧裡,我們簡化一下,流的作用是在出發地和目的地之間傳輸數據。出發地和目的地可以是文件、命令行進程、網路連接、ZIP 或 TAR 壓縮文件、臨時內存、標準輸入或輸出,或者是通過 PHP 流封裝協議實現的任何其他資源。
如果你讀寫過文件,就用過流;如果你從 php://stdin 讀取過數據,或者把輸入寫入 php://stdout ,也用過流。流為 PHP 的很多 IO 函數提供了底層實現,如 file_get_contents、fopn、fread 和 fwrite 等。PHP 的流函數提供了不同資源的統一介面。
我們可以把流比作管道,把水(資源數據)從一個地方引到另一個地方。在水從出發地到目的地的過程中,我們可以過濾水,可以改變水質,可以添加水,也可以排出水。
流式數據的種類各異,每種類型需要獨特的協議,以便讀寫數據,我們稱這些協議為 流封裝協議 。例如,我們可以讀寫文件系統,可以通過 HTTP、HTTPS 或 SSH 與遠程 Web 伺服器通信,還可以打開並讀寫 ZIP、RAR 或 PHAR 壓縮文件。這些通信方式都包含下述相同的過程:
1.開始通信
2.讀取數據
3.寫入數據
4.結束通信
雖然過程是一樣的,但是讀寫文件系統中文件的方式與收發 HTTP 消息的方式有所不同,流封裝協議的作用是使用通用的介面封裝這種差異。
每個流都有一個協議和一個目標。指定協議和目標的方法是使用流標識符:scheme://target,其中 scheme 是流的封裝協議,target 是流的數據源。
http://流封裝協議
下面使用 HTTP 流封裝協議創建了一個與 Flicker API 通信的 PHP 流:
不要以為這是普通的網頁 URL,file_get_contents() 函數的字元串參數其實是一個流標識符。http 協議會讓 PHP 使用 HTTP 流封裝協議,在這個參數中,http 之後是流的目標。
我們通常使用 file_get_contents()、fopen()、fwrite() 和 fclose() 等函數讀寫文件系統,因為 PHP 默認使用的流封裝協議是 file://,所以我們很少認為這些函數使用的是 PHP 流。下面的示例演示了使用 file:// 流封裝協議創建一個讀寫 /etc/hosts 文件的流:
我們通常會省略掉 file:// 協議,因為這是 PHP 使用的默認值。
php://流封裝協議
編寫命令行腳本的 PHP 開發者會感激 php:// 流封裝協議,這個流封裝協議的作用是與 PHP 腳本的標準輸入、標準輸出和標準錯誤文件描述符通信。我們可以使用 PHP 提供的文件系統函數打開、讀取或寫入下面四個流:
1. php://stdin :這是個只讀 PHP 流,其中的數據來自標準輸入。PHP 腳本可以使用這個流接收命令行傳入腳本的信息;
2. php://stdout :把數據寫入當前的輸出緩衝區,這個流只能寫,無法讀或定址;
3. php://memory :從系統內存中讀取數據,或者把數據寫入系統內存。缺點是系統內存有限,所有使用 php://temp 更安全;
4. php://temp :和 php://memory 類似,不過,沒有可用內存時,PHP 會把數據寫入這個臨時文件。
其他流封裝協議
PHP 和 PHP 擴展還提供了很多其他流封裝協議,例如,與 ZIP 和 TAR 壓縮文件、FTP 伺服器、數據壓縮庫、Amazon API、Dropbox API 等通信的流封裝協議。需要注意的是,PHP 中的 fopen()、fgets()、fputs()、feof() 以及 fclose() 等函數不僅可以用來處理文件系統中的文件,還可以在所有支持這些函數的流封裝協議中使用。
自定義流封裝協議
我們還可以自己編寫 PHP 流封裝協議。PHP 提供了一個示例 StreamWrapper 類,演示如何編寫自定義的流封裝協議,支持部分或全部 PHP 文件系統函數。關於如何編寫,具體請參考以下文檔:
有些 PHP 流能夠接受一系列可選的參數,這些參數叫流上下文,用於定製流的行為。不同的流封裝協議使用的流上下文有所不同,流上下文使用 stream_context_create() 函數創建,這個函數返回的上下文對象可以傳入大多數文件系統函數。
例如,你知道可以使用 file_get_contents() 發送 HTTP POST 請求嗎?使用一個流上下文對象即可實現:
流過濾器
目前為止我們討論了如何打開流,讀取流中的數據,以及把數據寫入流。不過,PHP 流真正強大的地方在於過濾、轉換、添加或刪除流中傳輸的數據,例如,我們可以打開一個流處理 Markdown 文件,在把文件內容讀入內存的過程中自動將其轉化為 HTML。
運行該腳本,輸出的都是大寫字母:
我們還可以使用 php://filter 流封裝協議把過濾器附加到流上,不過,使用這種方式之前必須先打開 PHP 流:
這個方式實現效果和 stream_filter_append() 函數一樣,但是相比之下更為繁瑣。不過,PHP 的某些文件系統函數在調用後無法附加過濾器,例如 file() 和 fpassthru(),使用這些函數時只能使用 php://filter 流封裝協議附加流過濾器。
自定義流過濾器
我們還可以編寫自定義的流過濾器。其實,大多數情況下都要使用自定義的流過濾器,自定義的流過濾器是個 PHP 類,繼承內置的 php_user_filter 類( ),且必須實現 filter()、onCreate() 和 onClose() 方法,最後,必須使用 stream_filter_register() 函數註冊自定義的流過濾器。
然後,我們必須使用 stream_filter_register() 函數註冊這個自定義的 DirtyWordsFilter 流過濾器:
第一個參數用於標識這個自定義過濾器的過濾器名,第二個參數是這個自定義過濾器的類名。接下來就可以使用這個自定義的流過濾器了:
修改 test.txt 內容如下:
運行上面的自定義過濾器腳本,結果如下:
stream_bucket_append函數:為隊列添加數據
stream_bucket_make_writeable函數:從操作的隊列中返回一個數據對象
stream_bucket_new函數:為當前隊列創建一個新的數據
stream_bucket_prepend函數:預備數據到隊列
stream_context_create函數:創建數據流上下文
stream_context_get_default函數:獲取默認的數據流上下文
stream_context_get_options函數:獲取數據流的設置
stream_context_set_option函數:對數據流、數據包或者上下文進行設置
stream_context_set_params函數:為數據流、數據包或者上下文設置參數
stream_copy_to_stream函數:在數據流之間進行複製操作
stream_filter_append函數:為數據流添加過濾器
stream_filter_prepend函數:為數據流預備添加過濾器
stream_filter_register函數:註冊一個數據流的過濾器並作為PHP類執行
stream_filter_remove函數:從一個數據流中移除過濾器
stream_get_contents函數:讀取數據流中的剩餘數據到字元串
stream_get_filters函數:返回已經註冊的數據流過濾器列表
stream_get_line函數:按照給定的定界符從數據流資源中獲取行
stream_get_meta_data函數:從封裝協議文件指針中獲取報頭/元數據
stream_get_transports函數:返回註冊的Socket傳輸列表
stream_get_wrappers函數:返回註冊的數據流列表
stream_register_wrapper函數:註冊一個用PHP類實現的URL封裝協議
stream_select函數:接收數據流數組並等待它們狀態的改變
stream_set_blocking函數:將一個數據流設置為堵塞或者非堵塞狀態
stream_set_timeout函數:對數據流進行超時設置
stream_set_write_buffer函數:為數據流設置緩衝區
stream_socket_accept函數:接受由函數stream_ socket_server()創建的Socket連接
stream_socket_client函數:打開網路或者UNIX主機的Socket連接
stream_socket_enable_crypto函數:為一個已經連接的Socket打開或者關閉數據加密
stream_socket_get_name函數:獲取本地或者網路Socket的名稱
stream_socket_pair函數:創建兩個無區別的Socket數據流連接
stream_socket_recvfrom函數:從Socket獲取數據,不管其連接與否
stream_socket_sendto函數:向Socket發送數據,不管其連接與否
stream_socket_server函數:創建一個網路或者UNIX Socket服務端
stream_wrapper_restore函數:恢復一個事先註銷的數據包
stream_wrapper_unregister函數:註銷一個URL地址包
整合資料
本文整合於以下兩篇文章
php的fopen函數打開文件詳解以及如何打開中
FILE *p=fopen(“a.txt”,”r”);用”r”打開的a.txt文件,該文件的數據只能被讀進來,但是你不能對a.txt文件進行任何的修改。而FILE *p=fopen(“a.txt”,”w”);則是寫格式,這樣你可以進行寫操作。以上FILE *p都是文件指針。
原創文章,作者:VTHH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133268.html