什么是PHP流拆撼?談一談你一直在用容劳,卻被你忽略的流

什么是PHP流喘沿?談一談你一直在用,卻被你忽略的流

定義

流的作用是使用統(tǒng)一的方式處理文件竭贩、網(wǎng)絡(luò)和數(shù)據(jù)壓縮等共用同一套函數(shù)和用法的操作蚜印。簡單而言,流是具有流式行為的資源對象留量。因此窄赋,流可以線性讀寫、或許還能使用fseek()函數(shù)定位到流中的任何位置 --PHP手冊

下面我們簡化一下楼熄,以便理解忆绰,流的作用是在出發(fā)地和目的地之間傳輸數(shù)據(jù)。出發(fā)地和目的地可以是文件可岂、命令行進程错敢、網(wǎng)絡(luò)連接、ZIP或TAR壓縮文件缕粹、臨時內(nèi)存伐债、標準輸入或輸出,或是通過PHP流封裝協(xié)議實現(xiàn)的任何其它資源

什么是PHP流致开?談一談你一直在用峰锁,卻被你忽略的流

流封裝協(xié)議

流式數(shù)據(jù)的種類各異,每種類型需要獨特的協(xié)議双戳,以便讀寫數(shù)據(jù)虹蒋。我們稱這些協(xié)議為流封裝協(xié)議。流封裝協(xié)議的作用是使用通用的接口封裝不同通信方式間的差異飒货。每個流都有一個協(xié)議和一個目標魄衅。格式如下:

<scheme>://<target>

其中<scheme>是流的封裝協(xié)議,<target>是流的數(shù)據(jù)源塘辅。

示例:使用HTTP流封裝協(xié)議與Flickr API通信

<?php
$json = file_get_contents('http://api.flickr.com/services/feeds/photos_public.gne?format=json');

file_get_contents()函數(shù)的字符串參數(shù)其實是一個流標識符晃虫。http協(xié)議會讓PHP使用HTTP流封裝協(xié)議。在這個參數(shù)中扣墩,http之后是流的目標哲银。流的目標之所以看起來像是普通的網(wǎng)頁URL,是因為HTTP流封裝協(xié)議就是這樣規(guī)定的呻惕。其它流封裝協(xié)議可能不是這樣荆责。(普通的URL其實就是PHP流封裝協(xié)議標識符的偽裝)

什么是PHP流?談一談你一直在用亚脆,卻被你忽略的流

file://流封裝協(xié)議

我們使用file_get_contents()做院、fopen()、fwrite()和fclose()函數(shù)讀寫文件系統(tǒng),因為PHP默認使用的流封裝協(xié)議是file://,所以我們很少認為這些函數(shù)使用的是PHP流键耕。我們在不經(jīng)意間就使用流PHP流寺滚!

示例:隱式使用file://流封裝協(xié)議

<?php
$handle = fopen('/etc/hosts', 'rb');
while(feof($handle) !== true) {
 echo fgets($handle);
}
fclose($handle);

下面這個示例的作用一樣,不過這一次我們在流標識符中明確指定流file://流封裝協(xié)議

示例:顯式的使用file://流封裝協(xié)議

<?php
$handle = fopen('file:///etc/hosts', 'rb');
while(feof($handle) !== true) {
echo fgets($handle);
}
fclose($handle);

我們通常會是省略file://封裝協(xié)議屈雄,因為這是PHP使用的默認值玛迄。

什么是PHP流?談一談你一直在用棚亩,卻被你忽略的流

php://流封裝協(xié)議

這個流封裝協(xié)議但作用是與PHP腳本的標準輸入蓖议、標準輸出和標準錯誤文件描述符通信。我們可以使用PHP提供的文件系統(tǒng)函數(shù)打開讥蟆、讀取或?qū)懭胂率鏊膫€流:

php://stdin

這個是只讀PHP流勒虾,其中的數(shù)據(jù)來自標準輸入。例如瘸彤,PHP腳本可以使用這個流接收命令行傳入的腳本的信息修然。

php://stdout

這個PHP流的作用是把數(shù)據(jù)寫入當前的輸出緩沖區(qū)。這個流只能寫质况,無法讀或?qū)ぶ贰?/p>

php://memory

這個PHP流的作用是從系統(tǒng)內(nèi)存中讀取數(shù)據(jù)愕宋,或者把數(shù)據(jù)寫入系統(tǒng)內(nèi)存。這個PHP流的缺點是结榄,可用內(nèi)存是有限的中贝,使用php://temp流更安全。

php://temp

這個PHP流的作用和php://memory類似臼朗,不過邻寿,沒有可用內(nèi)存時,PHP會把數(shù)據(jù)寫入臨時文件视哑。

什么是PHP流绣否?談一談你一直在用,卻被你忽略的流

其它流封裝協(xié)議

PHP和PHP擴展還提供流很多其他流封裝協(xié)議挡毅,例如蒜撮,與ZIP和TAR壓縮文件、FTP服務(wù)器跪呈、數(shù)據(jù)壓縮庫等通信的流封裝協(xié)議段磨。

自定義流封裝協(xié)議

我們還可以自己編寫流封裝協(xié)議,更多信息參見:

https://www.php.net/manual/zh/class.streamwrapper.php

https://www.php.net/manual/zh/stream.streamwrapper.example-1.php

什么是PHP流庆械?談一談你一直在用薇溃,卻被你忽略的流

流上下文

有些PHP流能接收一系列可選的參數(shù)菌赖,這些參數(shù)叫流上下文缭乘,用于定制流的行為。流上下文使用stream_context_create()函數(shù)創(chuàng)建。這個函數(shù)返回的上下文對象可以傳入大多數(shù)文件系統(tǒng)和流函數(shù)堕绩。

示例:流上下文(使用file_get_contents()函數(shù)發(fā)送HTTP POST請求)

<?php
$requestBody = '{"username":"josh"}';
$context = stream_context_create(array(
 'http' => array(
 'method' => 'POST',
 'header' => "Content-Type: application/json;charset=utf-8;\r\n" .
 "Content-Length: " . mb_strlen($requestBody),
 'content' => $requestBody
 )
));
$response = file_get_contents('https://my-api.com/users', false, $context); 

流過濾器

PHP真正強大的地方在于過濾策幼、轉(zhuǎn)換、添加或刪除流中傳輸?shù)臄?shù)據(jù)奴紧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末特姐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子黍氮,更是在濱河造成了極大的恐慌唐含,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沫浆,死亡現(xiàn)場離奇詭異捷枯,居然都是意外死亡,警方通過查閱死者的電腦和手機专执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門淮捆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人本股,你說我怎么就攤上這事攀痊。” “怎么了拄显?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵苟径,是天一觀的道長。 經(jīng)常有香客問我躬审,道長涩笤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任盒件,我火速辦了婚禮蹬碧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炒刁。我一直安慰自己恩沽,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布翔始。 她就那樣靜靜地躺著罗心,像睡著了一般。 火紅的嫁衣襯著肌膚如雪城瞎。 梳的紋絲不亂的頭發(fā)上渤闷,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音脖镀,去河邊找鬼飒箭。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的弦蹂。 我是一名探鬼主播肩碟,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凸椿!你這毒婦竟也來了削祈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤脑漫,失蹤者是張志新(化名)和其女友劉穎髓抑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體优幸,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡启昧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了劈伴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片密末。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跛璧,靈堂內(nèi)的尸體忽然破棺而出严里,到底是詐尸還是另有隱情,我是刑警寧澤追城,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布刹碾,位于F島的核電站,受9級特大地震影響座柱,放射性物質(zhì)發(fā)生泄漏迷帜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一色洞、第九天 我趴在偏房一處隱蔽的房頂上張望戏锹。 院中可真熱鬧,春花似錦火诸、人聲如沸锦针。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奈搜。三九已至,卻和暖如春盯荤,著一層夾襖步出監(jiān)牢的瞬間馋吗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工秋秤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宏粤,地道東北人脚翘。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像商架,于是被迫代替她去往敵國和親堰怨。 傳聞我的和親對象是個殘疾皇子芥玉,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 在現(xiàn)代 PHP 特性中蛇摸,流或許是最出色但使用率最低的。雖然 PHP 4.3 就引入了流灿巧,但是很多開發(fā)者并不知道流的...
    迷途大灰狼閱讀 5,264評論 0 4
  • 定義 流的作用是使用統(tǒng)一的方式處理文件赶袄、網(wǎng)絡(luò)和數(shù)據(jù)壓縮等共用同一套函數(shù)和用法的操作。簡單而言抠藕,流是具有流式行為的資...
    PHP程序媛閱讀 252評論 0 1
  • 良好實踐盾似,這次主要挑了一些開發(fā)PHP應(yīng)用時應(yīng)該運用上的良好實踐進行詳細記錄敬辣,特別是良好實踐部分中密碼和流兩個點。關(guān)...
    梅先森森森森森森閱讀 416評論 0 1
  • 良好實踐,這次主要挑了一些開發(fā)PHP應(yīng)用時應(yīng)該運用上的良好實踐進行詳細記錄告抄,特別是良好實踐部分中密碼和流兩個點撰茎。關(guān)...
    BeckJiang閱讀 2,112評論 6 41
  • 在工作當中你一定會遇到四種人龄糊,這四種人決定了社會層級,決定了一個人的一生的軌跡募疮,而且每個人都跑不出這四種人的范疇炫惩。...
    樹溪小姐閱讀 1,744評論 0 2