php獲取數據流,php 文件流

本文目錄一覽:

PHP關於獲取二進制數據流轉換為文件的方法

?php

$bin= bstr2bin($json);

file_put_contents(‘../somefold/’,$bin);

function bstr2bin($input){

// Binary representation of a binary-string

if (!is_string($input)) return null; // Sanity check

// Unpack as a hexadecimal string

$value = unpack(‘H*’, $input);

// Output binary representation

$value = str_split($value[1], 1);

$bin = ”;

foreach ($value as $v){

$b = str_pad(base_convert($v, 16, 2), 4, ‘0’, STR_PAD_LEFT);

$bin .= $b;

}

return $bin;

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+mysql如何讀取數據庫數據

大概的基本流程如下:

連接數據庫,再加一個判斷。

選擇數據庫

讀取表

輸出表中數據

下面是代碼:

?php

$con = mysql_connect(“localhost”,”root”,”abc123″);

/* localhost 是服務器 root 是用戶名 abc123 是密碼*/ 

if (!$con)

 {

 die(“數據庫服務器連接失敗”);

 }

/* 這就是一個邏輯非判斷,如果錯誤就輸出括號里的字符串 */ 

@mysql_select_db(“a”, $con); 

/* 選擇mysql服務器里的一個數據庫,假設你的數據庫名為 a*/

$sql = “SELECT * FROM qq”; 

/* 定義變量sql, “SELECT * FROM qq” 是SQL指令,表示選取表qq中的數據 */

$result = mysql_query($sql); //執行SQL語句,獲得結果集

/*下面就是選擇性的輸出打印了,由於不清楚你的具體情況給你個表格打印吧*/

//打印表格 

echo “table border=1”; 

while( $row = mysql_fetch_array($result) )

/*逐行獲取結果集中的記錄,得到數組row */

{  

/*數組row的下標對應着數據庫中的字段值 */

$id = $row[‘id’]; 

$name = $row[‘name’]; 

$sex = $row[‘sex’]; 

echo “tr”; 

echo “td$id/td”; 

echo “td$name/td”; 

echo “td$sex/td”; 

echo “/tr”; 

echo “table /”;

?

如果你的switch是表頭,就定義這個表頭字段,然後輸出。

php如何計算一段數據流的長度

blob取回來會是一個[字符串類型]的字節串,用strlen獲得字節數.

strlen()函數是沿用php2以來命名的函數,作用並不是統計字符數,而僅統計字節byte數。

即使php7.x仍沿用strlen數字節。

js怎麼讀取php後台返回的圖片數據流然後賦

js無法讀取php返回的二進制數據並轉成圖片顯示的,除非數據庫保存的是圖片地址,或者php端把二進制數據通過file_put_contents(“*.png”);再返回地址顯示

php 怎麼POST獲取數據?

方法1、最常見的方法是:$_POST[‘fieldname’];

說明:只能接收Content-Type:

application/x-www-form-urlencoded提交的數據

解釋:也就是表單POST過來的數據

方法2、file_get_contents(“php://input”);

說明:

允許讀取

POST

原始數據

$HTTP_RAW_POST_DATA

比起來,它給內存帶來的壓力較小,並且不需要任何特殊的

php.ini

設置。

php://input

不能用於

enctype=”multipart/form-data”。

解釋:

對於未指定

Content-Type

的POST數據,則可以使用file_get_contents(“php://input”);來獲取原始數據。

事實上,用PHP接收POST的任何數據都可以使用本方法。而不用考慮Content-Type,包括

二進制文件

流也可以。

所以用方法二是最保險的方法

方法3、$GLOBALS[‘HTTP_RAW_POST_DATA’];

說明:

總是產生

$HTTP_RAW_POST_DATA

變量包含有原始的

POST

數據。

此變量僅在碰到未識別

MIME

類型的數據時產生。

$HTTP_RAW_POST_DATA

對於

enctype=”multipart/form-data”

表單數據不可用

如果post過來的數據不是PHP能夠識別的,可以用

$GLOBALS[‘HTTP_RAW_POST_DATA’]來接收,

比如

text/xml

或者

soap

等等

解釋:

$GLOBALS[‘HTTP_RAW_POST_DATA’]存放的是POST過來的原始數據。

$_POST或

$_REQUEST

存放的是

PHP以key=value的形式格式化以後的數據。

但$GLOBALS[‘HTTP_RAW_POST_DATA’]中是否保存POST過來的數據取決於centent-Type的設置,即POST數據時

必須顯式示指明Content-Type:

application/x-www-form-urlencoded,POST的數據才會存放到

$GLOBALS[‘HTTP_RAW_POST_DATA’]中

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/297989.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相關推薦

發表回復

登錄後才能評論