Skip to content

Instantly share code, notes, and snippets.

@alganet
Last active July 3, 2020 18:50
Show Gist options
  • Save alganet/5010100 to your computer and use it in GitHub Desktop.
Save alganet/5010100 to your computer and use it in GitHub Desktop.
Respect Prático: Streams

Respect Prático: Streams

Agora que você já viu como trabalhar com streams no PHP, vou mostrar um pouco do suporte a streams do Respect!

Respect\Rest

O Respect\Rest foi o primeiro projeto PHP a suportar o controle de rotas com streaming e é o mais completo nisso. Fazer o stream de qualquer coisa é simples.

No exemplo a seguir, vamos servir um arquivo direto do disco, comprimindo ele no caminho somente se o navegador negociar com o Accept-Encoding apropriado:

<?php

use Respect\Rest\Router;
use Respect\Validation\Validator as v;

$router->get('/relatorios/*', function ($id) {

    $streamRelatorio = fopen("/relatorios/$id.txt", 'r');
    return $streamRelatorio;

})->when(function ($id) {

    return v::int($id)->min(0)->validate($id);

})->acceptEncoding(array(

    'deflate' => function($streamRelatorio) {
        stream_filter_append($streamRelatorio, 'zlib.deflate', STREAM_FILTER_READ);
        return $streamRelatorio;
    }

));

Isso não faz o arquivo ser carregado na memória jamais, como vimos no exemplo de streams do outro gist. Ele é beneficiado pelo stream_copy_to_stream.

Respect\Test

No Respect\Test o suporte ainda é experimental, mas bastante útil. Dentro de qualquer teste, você pode desabilitar o filesystem real e colocar em funcionamento um filesystem virtual que simula os aspectos que você precisa:

<?php

use Respect\Test\StreamWrapper;

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        StreamWrapper::setStreamOverrides(array(
            'my/example.txt' => 'Hello From Sample!',
            'my/version.txt' => '123'
        ));

    public function tearDown()
    {
        StreamWrapper::releaseOverrides();
    }
    
    public function testSomething()
    {
        $this->assertEquals('Hello From Sample!', file_get_contents('my/example.txt'));
        $this->assertEquals(123, file_get_contents('my/version.txt'));
    }
}

O setStreamOverrides define um conteúdo inicial do sistema de arquivos virtual, mas ele também é flexível pra você criar pastas no futuro com mkdir, criar novos arquivos e usar em cima dele bibliotecas que usariam um sistema de arquivos normal.

O releaseOverrides volta tudo como era =)

Dá pra simular mais coisas além de conteúdo fixo pros arquivos. Você pode simular streams mais complexas também repassando-as:

<?php

use Respect\Test\StreamWrapper;

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        StreamWrapper::setStreamOverrides(array(
            'my/stream.txt' => fopen('data:text/plain;base64,'. base64_encode('Some Streamed Data!!!'))
        ));
    }
}

Na Lista

Streams são importantes e poderosas no PHP. Espere mais novidades com elas em breve no Respect =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment