摘要:使用了來表示該,該接口也是對的抽象,暴露了一些常用方法判斷是否滿足要求的方法的讀寫相關操作獲取元數據方法操作指針相關方法等等。本篇主要學習下相關使用。后續還會分享相關使用,到時見。
說明:本文主要學習guzzlehttp/guzzle package的使用,該package提供了一套發送HTTP請求API,就像phpunit package, mockery package, symfony package, monolog package, league/filesystem package一樣,是一個經常被使用的package,也是Laravel框架的一個重要依賴之一。AWS SDK for PHP也是把該package作為一個基礎package來使用,以后也想就AWS SDK for PHP做一些個人分享,對AWS開發感興趣的可以參看官方文檔AWS SDK for PHP,并且AWS提供了官方認證考試:初級開發者證書AWS Certified Developer Associate,高級DevOps工程師證書AWS Certified DevOps Engineer Professional,感興趣可以參考官網:AWS Certification。學習Laravel不僅僅需要學習框架的使用和源碼,也需要學習這些常用package的使用,這些優秀的package提供了很多代碼設計思想和架構概念,這對提高個人設計代碼時的能力大有裨益。
本小篇主要學習下Guzzle package的Stream概念和使用,如果對Guzzle package不是很了解可以看下官網Guzzle。
Streams一次HTTP請求是由起始行、消息頭、消息體組成的,消息體(payloads)可以是很小或者很大,如果使用字符串來存儲消息體的話,對于很大的消息體如一個大文件,用字符串存儲就會很消耗內存,所以對于大消息體就需要使用Stream來表示。Guzzle使用了PsrHttpMessageStreamInterface來表示該Stream Objects,該接口也是對PHP Streams的抽象,暴露了一些常用方法:判斷stream是否滿足要求的方法,isReadable(), isWriable(), isSeekable();stream的讀寫相關操作,read(), write(), close();獲取元數據方法,getMetadata(), getSize();stream操作指針相關方法,rewind(), tell(), eof(), seek(),等等。
在psr/http-message package中提供了如下接口:PsrHttpMessageStreamInterface, PsrHttpMessageRequestInterface, PsrHttpMessageServerRequestInterface, PsrHttpMessageResponseInterface, PsrHttpMessageMessageInterface, PsrHttpMessageUriInterface, PsrHttpMessageUploadedFileInterface。而guzzle/psr7 package提供了這些接口對應的實現:GuzzleHttpPsr7Stream, GuzzleHttpPsr7Request, GuzzleHttpPsr7ServerRequest, GuzzleHttpPsr7Response, GuzzleHttpPsr7Message, GuzzleHttpPsr7Uri, GuzzleHttpPsr7UploadedFile。
本篇主要學習下GuzzleHttpPsr7Stream相關使用。
Creating Streams構造一個stream最好方式是使用GuzzleHttpPsr7stream_for,該方法可以接收string, resources from open(), object implements __toString() or PsrHttpMessageStreamInterface, callables, iterators,寫一個PHPUnit測試看下stream的創建,爆綠燈:
// 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作為參數來構造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)); }
還可以把一個resource作為參數來構造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可以參考官網。AppendStream修飾器顧名思義就是可以讀取多個stream并拼接成一個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); }
總結:學習Guzzle Package的使用是必要的,該package經常作為一個重要依賴被其他package使用,比如AWS SDK for PHP就嚴重使用該package來做HTTP請求。后續還會分享Guzzle Package相關使用,到時見。
RightCapital招聘Laravel DevOps
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21984.html
摘要:說明本文主要講述了的文件系統的小,邏輯不復雜,主要就是把上的一個文件下載到本地,和下載到中。寫驅動由于沒有驅動,需要自定義下在中寫上名為的驅動同時在注冊下該就行。執行命令后,顯示上文件從上下載到上的文件該邏輯簡單,但很好玩。 說明:本文主要講述了Laravel的文件系統Filesystem的小Demo,邏輯不復雜,主要就是把Dropbox上的一個文件下載到本地local,和下載到AWS...
摘要:發送接受是個可以訪問請求的原始數據的只讀流。在之前打開的數據流只能讀取一次數據流不支持操作。不過,依賴于的實現,請求體數據被保存的時候,它可以打開另一個數據流并重新讀取。 現在微服務中,很多API由于需要傳遞的參數較多所以要求用包含所有參數的JSON數據作為POST請求的請求體來替代FormData傳遞參數的方式,在參數量較多時POST JSON要比POST FormData便于開發和...
摘要:可以使用來做,也是作者開發的,可靠性也有保證。不管怎樣,總會遇到很多不僅僅一個需要的,這個具有公用性的就可以做成一個放在公司內部搭建的鏡像上,這也極大提高整體的開發效率。 隨著業務越來越復雜,有些service具有通用性,即Repo A中的某一service其他的幾個Repo都會不同程度的需要,如果能把該service作為一個獨立的package,這樣其他的Repo可以composer...
摘要:本文經授權轉自社區說明庫是一套強大的請求套件。本文重點演示如何使用發起多線程請求。 本文經授權轉自 PHPHub 社區 說明 Guzzle 庫是一套強大的 PHP HTTP 請求套件。 本文重點演示如何使用 Guzzle 發起多線程請求。 參考 Github 官方用戶接口文檔 Guzzle 并發請求文檔 Laravel LTS 5.1 - Artisan 文檔 創建命令 1. 運行...
摘要:年開發者應該熟練使用,并且知道版本更新內容。對開發和運維人員來說,最希望的就是一次性創建或配置,可以在任意地方正常運行。是標準規范,是開發的實踐標準。對開發者來說語言推薦和,全棧的選擇非常多,推薦熱門的 前言 在前天(2018-08-02)已經發布了PHP 7.3.0.beta1 Released 如果你還沒有使用 PHP7 ,那真的很遺憾。2018年PHP開發者應該熟練使用 PHP7...
閱讀 1681·2021-11-23 09:51
閱讀 2691·2021-11-22 09:34
閱讀 1327·2021-10-14 09:43
閱讀 3668·2021-09-08 09:36
閱讀 3214·2019-08-30 12:57
閱讀 2035·2019-08-30 12:44
閱讀 2524·2019-08-29 17:15
閱讀 3021·2019-08-29 16:08