Agora que você já viu como trabalhar com streams no PHP, vou mostrar um pouco do suporte a streams do Respect!
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
.
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!!!'))
));
}
}
Streams são importantes e poderosas no PHP. Espere mais novidades com elas em breve no Respect =)