php使用fopen與file,php fsocketopen

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VTHH的頭像VTHH
上一篇 2024-10-03 23:57
下一篇 2024-10-03 23:57

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • Python File文件怎麼打開

    Python的File是讀寫文件的重要操作之一,那麼如何打開Python中的文件呢?下面我們從多個方面進行詳細的闡述。 一、直接打開文件 可以使用Python的open()函數打開…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • file*詳解

    一、file是什麼 在C語言中,我們可以通過定義「file」類型的指針來操作文件,而這個指針所指向的就是文件在內存中的映射。通過對file變數的各種操作,我們可以對文件做讀、寫、打…

    編程 2025-04-25
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台伺服器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24

發表回復

登錄後才能評論