资讯专栏INFORMATION COLUMN

Laravel学习笔记之Core Concepts in Guzzle Package——Strea

singerye / 391人阅读

摘要:使用了来表示该,该接口也是对的抽象,暴露了一些常用方法判断是否满足要求的方法的读写相关操作获取元数据方法操作指针相关方法等等。本篇主要学习下相关使用。后续还会分享相关使用,到时见。

说明:本文主要学习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 packageStream概念和使用,如果对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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21984.html

相关文章

  • Laravel学习笔记Filesystem-从Dropbox中下载文件到AWS S3

    摘要:说明本文主要讲述了的文件系统的小,逻辑不复杂,主要就是把上的一个文件下载到本地,和下载到中。写驱动由于没有驱动,需要自定义下在中写上名为的驱动同时在注册下该就行。执行命令后,显示上文件从上下载到上的文件该逻辑简单,但很好玩。 说明:本文主要讲述了Laravel的文件系统Filesystem的小Demo,逻辑不复杂,主要就是把Dropbox上的一个文件下载到本地local,和下载到AWS...

    tylin 评论0 收藏0
  • PHP发送和接收JSON请求

    摘要:发送接受是个可以访问请求的原始数据的只读流。在之前打开的数据流只能读取一次数据流不支持操作。不过,依赖于的实现,请求体数据被保存的时候,它可以打开另一个数据流并重新读取。 现在微服务中,很多API由于需要传递的参数较多所以要求用包含所有参数的JSON数据作为POST请求的请求体来替代FormData传递参数的方式,在参数量较多时POST JSON要比POST FormData便于开发和...

    PiscesYE 评论0 收藏0
  • Laravel 学习笔记 Toran Proxy 搭建私有Packagist镜像

    摘要:可以使用来做,也是作者开发的,可靠性也有保证。不管怎样,总会遇到很多不仅仅一个需要的,这个具有公用性的就可以做成一个放在公司内部搭建的镜像上,这也极大提高整体的开发效率。 随着业务越来越复杂,有些service具有通用性,即Repo A中的某一service其他的几个Repo都会不同程度的需要,如果能把该service作为一个独立的package,这样其他的Repo可以composer...

    senntyou 评论0 收藏0
  • Laravel 下使用 Guzzle 编写多线程爬虫实战

    摘要:本文经授权转自社区说明库是一套强大的请求套件。本文重点演示如何使用发起多线程请求。 本文经授权转自 PHPHub 社区 说明 Guzzle 库是一套强大的 PHP HTTP 请求套件。 本文重点演示如何使用 Guzzle 发起多线程请求。 参考 Github 官方用户接口文档 Guzzle 并发请求文档 Laravel LTS 5.1 - Artisan 文档 创建命令 1. 运行...

    hzx 评论0 收藏0
  • PHP新手开发者的路线建议

    摘要:年开发者应该熟练使用,并且知道版本更新内容。对开发和运维人员来说,最希望的就是一次性创建或配置,可以在任意地方正常运行。是标准规范,是开发的实践标准。对开发者来说语言推荐和,全栈的选择非常多,推荐热门的 前言 在前天(2018-08-02)已经发布了PHP 7.3.0.beta1 Released 如果你还没有使用 PHP7 ,那真的很遗憾。2018年PHP开发者应该熟练使用 PHP7...

    klinson 评论0 收藏0

发表评论

0条评论

singerye

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<