摘要:使用了來表示該,該接口也是對的抽象,暴露了一些常用方法判斷是否滿足要求的方法的讀寫相關(guān)操作獲取元數(shù)據(jù)方法操作指針相關(guān)方法等等。本篇主要學(xué)習(xí)下相關(guān)使用。后續(xù)還會分享相關(guān)使用,到時(shí)見。
說明:本文主要學(xué)習(xí)guzzlehttp/guzzle package的使用,該package提供了一套發(fā)送HTTP請求API,就像phpunit package, mockery package, symfony package, monolog package, league/filesystem package一樣,是一個(gè)經(jīng)常被使用的package,也是Laravel框架的一個(gè)重要依賴之一。AWS SDK for PHP也是把該package作為一個(gè)基礎(chǔ)package來使用,以后也想就AWS SDK for PHP做一些個(gè)人分享,對AWS開發(fā)感興趣的可以參看官方文檔AWS SDK for PHP,并且AWS提供了官方認(rèn)證考試:初級開發(fā)者證書AWS Certified Developer Associate,高級DevOps工程師證書AWS Certified DevOps Engineer Professional,感興趣可以參考官網(wǎng):AWS Certification。學(xué)習(xí)Laravel不僅僅需要學(xué)習(xí)框架的使用和源碼,也需要學(xué)習(xí)這些常用package的使用,這些優(yōu)秀的package提供了很多代碼設(shè)計(jì)思想和架構(gòu)概念,這對提高個(gè)人設(shè)計(jì)代碼時(shí)的能力大有裨益。
本小篇主要學(xué)習(xí)下Guzzle package的Stream概念和使用,如果對Guzzle package不是很了解可以看下官網(wǎng)Guzzle。
Streams一次HTTP請求是由起始行、消息頭、消息體組成的,消息體(payloads)可以是很小或者很大,如果使用字符串來存儲消息體的話,對于很大的消息體如一個(gè)大文件,用字符串存儲就會很消耗內(nèi)存,所以對于大消息體就需要使用Stream來表示。Guzzle使用了PsrHttpMessageStreamInterface來表示該Stream Objects,該接口也是對PHP Streams的抽象,暴露了一些常用方法:判斷stream是否滿足要求的方法,isReadable(), isWriable(), isSeekable();stream的讀寫相關(guān)操作,read(), write(), close();獲取元數(shù)據(jù)方法,getMetadata(), getSize();stream操作指針相關(guān)方法,rewind(), tell(), eof(), seek(),等等。
在psr/http-message package中提供了如下接口:PsrHttpMessageStreamInterface, PsrHttpMessageRequestInterface, PsrHttpMessageServerRequestInterface, PsrHttpMessageResponseInterface, PsrHttpMessageMessageInterface, PsrHttpMessageUriInterface, PsrHttpMessageUploadedFileInterface。而guzzle/psr7 package提供了這些接口對應(yīng)的實(shí)現(xiàn):GuzzleHttpPsr7Stream, GuzzleHttpPsr7Request, GuzzleHttpPsr7ServerRequest, GuzzleHttpPsr7Response, GuzzleHttpPsr7Message, GuzzleHttpPsr7Uri, GuzzleHttpPsr7UploadedFile。
本篇主要學(xué)習(xí)下GuzzleHttpPsr7Stream相關(guān)使用。
Creating Streams構(gòu)造一個(gè)stream最好方式是使用GuzzleHttpPsr7stream_for,該方法可以接收string, resources from open(), object implements __toString() or PsrHttpMessageStreamInterface, callables, iterators,寫一個(gè)PHPUnit測試看下stream的創(chuàng)建,爆綠燈:
// tests/Guzzle/StreamTest.php namespace AppTestsGuzzle; class StreamTest extends TestCase { public function testCreatingStringStream() { /** @var GuzzleHttpPsr7Stream $stream */ $stream = GuzzleHttpPsr7stream_for("Laravel is a stream."); $this->assertEquals("Laravel is a stream.", $stream); $stream = GuzzleHttpPsr7stream_for("Laravel is a stream."); $this->assertEquals("Laravel", $stream->read(7)); $this->assertEquals(" is a stream.", $stream->getContents()); $this->assertEquals(true, $stream->eof()); $this->assertEquals(20, $stream->tell()); } } // tests/Guzzle/TestCase.php namespace AppTestsGuzzle; use AppTestsTestCase as BaseCase; abstract class TestCase extends BaseCase { }
還可以把iterator作為參數(shù)來構(gòu)造stream,PHPUnit測試爆綠燈:
public function testCreatingIteratorStream() { $generator = function ($num) { for ($i = 0; $i < $num; $i++) { yield "laravel."; } }; $stream = GuzzleHttpPsr7stream_for($generator(3)); $this->assertEquals("laravel.laravel.laravel.", $stream->read(24)); }
還可以把一個(gè)resource作為參數(shù)來構(gòu)造stream,PHPUnit測試爆綠燈:
public function testResourceStreamMetadata() { $resource = fopen(storage_path("/logs/laravel.log"), "r"); $stream = GuzzleHttpPsr7stream_for($resource); $this->assertEquals(storage_path("/logs/laravel.log"), $stream->getMetadata("uri")); $this->assertTrue($stream->isReadable()); $this->assertFalse($stream->isWritable()); $this->assertTrue($stream->isSeekable()); }Stream Decorators
Guzzle也提供了一些Stream Decorators來修飾stream handlers,這些Decorators主要包括以下幾種:
AppendStream
BufferStream
CachingStream
DroppingStream
FnStream
InflateStream
LazyOpenStream
LimitStream
NoSeekStream
PumpStream
這里僅僅以GuzzleHttpPsr7AppendStream為例說明下Stream Decorator的使用,其他的Decorator可以參考官網(wǎng)。AppendStream修飾器顧名思義就是可以讀取多個(gè)stream并拼接成一個(gè)stream,PHPUnit測試爆綠燈:
public function testAppendStream() { $stream1 = GuzzleHttpPsr7stream_for("Laravel"); $stream2 = GuzzleHttpPsr7stream_for(" is "); $stream3 = GuzzleHttpPsr7stream_for("great!!!"); $append_stream = new GuzzleHttpPsr7AppendStream([$stream1, $stream2]); $append_stream->addStream($stream3); $this->assertEquals("Laravel is great!!!", $append_stream); }
總結(jié):學(xué)習(xí)Guzzle Package的使用是必要的,該package經(jīng)常作為一個(gè)重要依賴被其他package使用,比如AWS SDK for PHP就嚴(yán)重使用該package來做HTTP請求。后續(xù)還會分享Guzzle Package相關(guān)使用,到時(shí)見。
RightCapital招聘Laravel DevOps
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21984.html
摘要:說明本文主要講述了的文件系統(tǒng)的小,邏輯不復(fù)雜,主要就是把上的一個(gè)文件下載到本地,和下載到中。寫驅(qū)動由于沒有驅(qū)動,需要自定義下在中寫上名為的驅(qū)動同時(shí)在注冊下該就行。執(zhí)行命令后,顯示上文件從上下載到上的文件該邏輯簡單,但很好玩。 說明:本文主要講述了Laravel的文件系統(tǒng)Filesystem的小Demo,邏輯不復(fù)雜,主要就是把Dropbox上的一個(gè)文件下載到本地local,和下載到AWS...
摘要:發(fā)送接受是個(gè)可以訪問請求的原始數(shù)據(jù)的只讀流。在之前打開的數(shù)據(jù)流只能讀取一次數(shù)據(jù)流不支持操作。不過,依賴于的實(shí)現(xiàn),請求體數(shù)據(jù)被保存的時(shí)候,它可以打開另一個(gè)數(shù)據(jù)流并重新讀取。 現(xiàn)在微服務(wù)中,很多API由于需要傳遞的參數(shù)較多所以要求用包含所有參數(shù)的JSON數(shù)據(jù)作為POST請求的請求體來替代FormData傳遞參數(shù)的方式,在參數(shù)量較多時(shí)POST JSON要比POST FormData便于開發(fā)和...
摘要:可以使用來做,也是作者開發(fā)的,可靠性也有保證。不管怎樣,總會遇到很多不僅僅一個(gè)需要的,這個(gè)具有公用性的就可以做成一個(gè)放在公司內(nèi)部搭建的鏡像上,這也極大提高整體的開發(fā)效率。 隨著業(yè)務(wù)越來越復(fù)雜,有些service具有通用性,即Repo A中的某一service其他的幾個(gè)Repo都會不同程度的需要,如果能把該service作為一個(gè)獨(dú)立的package,這樣其他的Repo可以composer...
摘要:本文經(jīng)授權(quán)轉(zhuǎn)自社區(qū)說明庫是一套強(qiáng)大的請求套件。本文重點(diǎn)演示如何使用發(fā)起多線程請求。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 說明 Guzzle 庫是一套強(qiáng)大的 PHP HTTP 請求套件。 本文重點(diǎn)演示如何使用 Guzzle 發(fā)起多線程請求。 參考 Github 官方用戶接口文檔 Guzzle 并發(fā)請求文檔 Laravel LTS 5.1 - Artisan 文檔 創(chuàng)建命令 1. 運(yùn)行...
摘要:年開發(fā)者應(yīng)該熟練使用,并且知道版本更新內(nèi)容。對開發(fā)和運(yùn)維人員來說,最希望的就是一次性創(chuàng)建或配置,可以在任意地方正常運(yùn)行。是標(biāo)準(zhǔn)規(guī)范,是開發(fā)的實(shí)踐標(biāo)準(zhǔn)。對開發(fā)者來說語言推薦和,全棧的選擇非常多,推薦熱門的 前言 在前天(2018-08-02)已經(jīng)發(fā)布了PHP 7.3.0.beta1 Released 如果你還沒有使用 PHP7 ,那真的很遺憾。2018年P(guān)HP開發(fā)者應(yīng)該熟練使用 PHP7...
閱讀 1653·2021-11-23 09:51
閱讀 2677·2021-11-22 09:34
閱讀 1316·2021-10-14 09:43
閱讀 3661·2021-09-08 09:36
閱讀 3206·2019-08-30 12:57
閱讀 2025·2019-08-30 12:44
閱讀 2516·2019-08-29 17:15
閱讀 3014·2019-08-29 16:08