亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP流Streams、包裝器wrapper概念與用法實例詳解

2024-05-05 00:01:09
字體:
來源:轉載
供稿:網友

本文實例講述了PHP流Streams、包裝器wrapper概念與用法。分享給大家供大家參考,具體如下:

流Streams這個概念是在php4.3引進的,是對流式數據的抽象,用于統一數據操作,比如文件數據、網絡數據、壓縮數據等,以使可以共享同一套函數,php的文件系統函數就是這樣的共享,比如file_get_contents()函數即可打開本地文件也可以訪問url就是這一體現。簡單點講,流就是表現出流式數據行為的資源對象。

以線性方式進行讀寫,并可以在流里面任意位置進行搜索。

流有點類似數據庫抽象層,在數據庫抽象層方面,不管使用何種數據庫,在抽象層之上都使用相同的方式操作數據,而流是對數據的抽象,它不管是本地文件還是遠程文件還是壓縮文件等等,只要來的是流式數據,那么操作方式就是一樣的。

有了流這個概念就引申出了包裝器wrapper這個概念,每個流都對應一種包裝器,流是從統一操作這個角度產生的一個概念,而包裝器呢是從理解流數據內容出發產生的一個概念,也就是這個統一的操作方式怎么操作或配置不同的內容;

這些內容都是以流的方式呈現,但內容規則是不一樣的,比如http協議傳來的數據是流的方式,但只有http包裝器才理解http協議傳來的數據的意思,可以這么理解,流就是一根流水的管子,只不過它流出的是數據,包裝器就是套在流這根管子外層的一個解釋者,它理解流出的數據的意思,并能操作它。

官方手冊說:“一個包裝器是告訴流怎么處理特殊協議或編碼的附加代碼”明白這句話的意思了嗎?

包裝器可以嵌套,一個流外面包裹了一個包裝器后,還可以在外層繼續包裹包裝器,這個時候里層的包裝器相對于外層的包裝器充當流的角色
在php自身底層實現的c語言開發文檔有這樣的解釋:

流API操作一對不同級別:在基本級別,api定義了php_stream對象表示流式數據源,在稍微高一點的級別,api定義了php_stream_wrapper對象。

它包裹低一級別的php_stream對象,以提供取回URL的內容和元數據、添加上下文參數的能力,調整包裝器行為;

每一種流打開后都可以應用任意數量的過濾器在上面,流數據會經過過濾器的處理,筆者認為過濾器這個詞用得有點不準確,有些誤導人。

從字面意思看好像是去掉一些數據的感覺,應該稱為數據調整器,因為它既可去掉一些數據,也可以添加,還可以修改,但歷史原因約定俗成,也就稱為過濾器了,大家心里明白就好。

我們經常看到下面的詞,來解釋下他們的區別:

資源和數據:資源是比較宏觀的說法,通常包含數據,而數據是比較具象的說法,在開發程序的時候經常說是數據,而在軟件規劃時說是資源,他們是近義詞,就像軟件設計和程序開發的區別一樣。

上下文和參數:上下文是比較宏觀的說法,經常用在溝通上面,具體點講就是一次溝通本身的參數,而參數這個說法往往用在比較具體的事情上面,比如說函數

上面解釋了概念性的東西,下面來看看具體內容:

php支持的協議和包裝器請看這里:http://php.net/manual/zh/wrappers.php:
(筆者注:原標題是:支持的協議和封裝協議,中文翻譯有點誤導,準確的講就是支持的協議和包裝器,從英文版面就很清楚)
默認的支持了一些協議和包裝器,請用stream_get_wrappers()函數查看.也可以自定義一個包裝器,用stream_wrapper_register()注冊
盡管RFC 3986里面可以使用:做分割符,但php只允許://,所以url請使用"scheme://target"這樣的格式

file:// — 訪問本地文件系統,在用文件系統函數時默認就使用該包裝器
http:// — 訪問 HTTP(s) 網址
ftp:// — 訪問 FTP(s) URLs
php:// — 訪問各個輸入/輸出流(I/O streams)
zlib:// — 壓縮流
data:// — 數據(RFC 2397)
glob:// — 查找匹配的文件路徑模式
phar:// — PHP 歸檔
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音頻流
expect:// — 處理交互式的流

如何實現一個自定義的包裝器:

在用fopen、fwrite、fread、fgets、feof、rewind、file_put_contents、file_get_contents等等文件系統函數操作流時,數據是先傳給定義的包裝器類對象,包裝器再去操作流。
如何實現一個自定義的流包裝器呢?php提供了一個類原型,只是原型而已,不是接口也不是類,不能用于繼承:

streamWrapper {/* 屬性 */public resource $context ;/* 方法 */__construct ( void )__destruct ( void )public bool dir_closedir ( void )public bool dir_opendir ( string $path , int $options )public string dir_readdir ( void )public bool dir_rewinddir ( void )public bool mkdir ( string $path , int $mode , int $options )public bool rename ( string $path_from , string $path_to )public bool rmdir ( string $path , int $options )public resource stream_cast ( int $cast_as )public void stream_close ( void )public bool stream_eof ( void )public bool stream_flush ( void )public bool stream_lock ( int $operation )public bool stream_metadata ( string $path , int $option , mixed $value )public bool stream_open ( string $path , string $mode , int $options , string &$opened_path )public string stream_read ( int $count )public bool stream_seek ( int $offset , int $whence = SEEK_SET )public bool stream_set_option ( int $option , int $arg1 , int $arg2 )public array stream_stat ( void )public int stream_tell ( void )public bool stream_truncate ( int $new_size )public int stream_write ( string $data )public bool unlink ( string $path )public array url_stat ( string $path , int $flags )}

在這個原型里面定義的方法,根據自己需要去定義,并不要求全部實現,這就是為什么不定義成接口的原因,因為有些實現根本用不著某些方法,
這帶來很多靈活性,比如包裝器是不支持刪除目錄rmdir功能的,那么就不需要實現streamWrapper::rmdir
由于未實現它,如果用戶在包裝器上調用rmdir將有錯誤拋出,要自定義這個錯誤那么也可以實現它并在其內部拋出錯誤
streamWrapper也不是一個預定義類,測試class_exists("streamWrapper")就知道,它只是一個指導開發者的原型

官方手冊提供了一個例子:http://php.net/manual/zh/stream.streamwrapper.example-1.php

本博客提供一個從drupal8系統中抽取修改過的包裝器例子,請看drupal8源碼分析關于流那一部分

流系列函數,官方手冊:http://php.net/manual/zh/ref.stream.php

常用的函數如下:

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地址包

一個過濾器的列子及解釋:

官網相關鏈接:

用戶過濾器基類:http://php.net/manual/zh/class.php-user-filter.php
過濾器注冊:http://php.net/manual/zh/function.stream-filter-register.php

<?php/* 定義一個過濾器 */class strtoupper_filter extends php_user_filter { function filter($in, $out, &$consumed, $closing) {  while ($bucket = stream_bucket_make_writeable($in)) { //從流里面取出一段數據   $bucket->data = strtoupper($bucket->data);   $consumed += $bucket->datalen;   stream_bucket_append($out, $bucket); //將修改后的數據送到輸出的地方  }  return PSFS_PASS_ON; }}/* 注冊過濾器到php */stream_filter_register("strtoupper", "strtoupper_filter")  or die("Failed to register filter");$fp = fopen("foo-bar.txt", "w");/* 應用過濾器到一個流 */stream_filter_append($fp, "strtoupper");fwrite($fp, "Line1/n");fwrite($fp, "Word - 2/n");fwrite($fp, "Easy As 123/n");fclose($fp);//讀取并顯示內容 將全部變為大寫readfile("foo-bar.txt");?>

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品亚洲精品| 欧美黑人xxx| 亚洲电影免费在线观看| 精品久久久久久久久久久久久| 大桥未久av一区二区三区| 欧美另类99xxxxx| 国产欧美精品日韩精品| 国产精品久久久久7777婷婷| 黄色成人在线播放| 97超碰国产精品女人人人爽| 性色av一区二区咪爱| 欧美怡红院视频一区二区三区| 亚洲美女免费精品视频在线观看| 欧美日韩国产成人在线观看| 亚洲欧美综合精品久久成人| 懂色av影视一区二区三区| 国产成人福利夜色影视| 国产精品免费视频xxxx| 欧美成人黄色小视频| 欧美激情区在线播放| 欧美日韩一区二区免费视频| 51久久精品夜色国产麻豆| 少妇高潮久久77777| 日韩精品视频在线观看网址| 在线亚洲男人天堂| 国产91精品久久久| 亚洲自拍在线观看| 国产成人精品综合久久久| 午夜精品www| 国产成人综合精品在线| 91久久中文字幕| 久久久久亚洲精品成人网小说| 国产精品一区二区三区免费视频| 91免费国产视频| 91精品国产自产在线| 国产视频久久久久久久| 日韩欧美在线网址| 国产成人一区二| 国模gogo一区二区大胆私拍| 欧美一级在线亚洲天堂| 亚洲精品之草原avav久久| 亚洲一区二区在线播放| 69影院欧美专区视频| 亚洲欧美日韩高清| 国产精品视频播放| 日韩av电影手机在线| 国产在线拍偷自揄拍精品| 清纯唯美亚洲激情| 8x海外华人永久免费日韩内陆视频| 亚洲国产成人爱av在线播放| 懂色av影视一区二区三区| 亚洲欧美成人精品| 欧美成人激情视频免费观看| 国产主播欧美精品| 91嫩草在线视频| 亚洲人成绝费网站色www| 亚洲一区二区精品| 国产欧美久久久久久| 精品国产电影一区| 久久这里只有精品99| 久久精品视频在线播放| 亚洲色图欧美制服丝袜另类第一页| 欧美精品第一页在线播放| 亚洲一区二区三区sesese| 久久综合亚洲社区| 欧美日本中文字幕| 日本亚洲欧洲色α| 亚洲天堂精品在线| 亚洲综合最新在线| 亚洲天堂免费视频| 久久激情五月丁香伊人| 欧美激情一区二区三级高清视频| 欧美日韩国产一中文字不卡| 欧美人与性动交a欧美精品| 亚洲欧美综合另类中字| 26uuu亚洲伊人春色| 午夜欧美不卡精品aaaaa| 国内精品视频在线| 国产一区二区三区在线视频| 欧美黄网免费在线观看| 国产精品三级美女白浆呻吟| 国产一区二区色| 久久亚洲欧美日韩精品专区| 亚洲福利视频二区| 亚洲xxxx视频| 国产成人自拍视频在线观看| 色樱桃影院亚洲精品影院| 热久久这里只有精品| 91欧美精品成人综合在线观看| 国产精品久久久久久久久久尿| 欧美一区二区三区艳史| 国产精品久久久久久久久久三级| 亚洲综合成人婷婷小说| 欧美日韩一区二区在线| 国产精品扒开腿做爽爽爽的视频| 久久久最新网址| 欧美成aaa人片免费看| 亚洲精品国产美女| 98视频在线噜噜噜国产| 91欧美日韩一区| 久热精品视频在线免费观看| 国产午夜精品久久久| 久久精品视频va| 亚洲一区二区少妇| 亚洲一区二区免费在线| 久久精品亚洲精品| 欧美日韩国产中文精品字幕自在自线| 国产免费一区二区三区在线观看| 国产精品黄色影片导航在线观看| 亚洲一区二区三区成人在线视频精品| 疯狂做受xxxx高潮欧美日本| 亚洲国产精品成人va在线观看| 日韩精品视频在线播放| 成人欧美在线视频| 亚洲色图色老头| 中文字幕亚洲欧美日韩2019| 久久精品视频免费播放| 91精品久久久久久综合乱菊| 国产精品爱久久久久久久| 久久五月情影视| 亚洲国产成人在线视频| 亚洲精品二三区| 久久国产精品视频| 国产成人免费91av在线| 日韩在线中文字幕| 国产久一一精品| 久久久久久久久国产| 亚洲欧美日韩天堂| 亚洲天堂影视av| 高清在线视频日韩欧美| 亚洲精品99久久久久| 成人av电影天堂| 精品中文字幕在线观看| 日韩精品在线视频观看| 国内精品久久久久影院 日本资源| 国产精品丝袜一区二区三区| 欧美极品美女视频网站在线观看免费| 欧美激情一区二区三区在线视频观看| 97视频免费在线观看| 成人黄色免费在线观看| 97久久精品人人澡人人爽缅北| 国产亚洲美女精品久久久| 久久久精品国产一区二区| 欧美激情在线一区| 久久在线精品视频| 亚洲高清一二三区| 亚洲xxxxx| 91精品国产综合久久香蕉的用户体验| 午夜精品免费视频| 欧美理论片在线观看| 91在线免费视频| 亚洲日本中文字幕免费在线不卡| 久久久久久久久久久亚洲| 亚洲人成在线观看网站高清| 美日韩精品免费视频| 日韩欧美在线视频| 在线成人一区二区| 欧洲午夜精品久久久| 亚洲大尺度美女在线| 亚洲第一精品福利| 亚洲第一页自拍| 欧美一区二区色| 亚洲精品wwwww| 色综合老司机第九色激情|