On this page
Caution
The documentation you are viewing is for an older version of this component.
Switch to the latest (v3) version.
Reference
Emitting Responses
Introduction
Deprecated
Emitters are deprecated from Diactoros starting with version 1.8.0. The functionality is now available for any PSR-7 implementation via the package laminas/laminas-httphandlerrunner. We suggest using that functionality instead.
If you are using a non-SAPI PHP implementation and wish to use the Server class, or if you do not
want to use the Server implementation but want to emit a response, this package provides an
interface, Laminas\Diactoros\Response\EmitterInterface, defining a method emit() for emitting the
response.
Diactoros provides two implementations currently, both for working with
traditional Server API (SAPI) implementations: Laminas\Diactoros\Response\SapiEmitter
and Laminas\Diactoros\Response\SapiStreamEmitter. Each uses the native header()
PHP function to emit headers, and echo() to emit the response body.
If you are using a non-SAPI implementation, you will need to create your own
EmitterInterface implementation.
For example, the SapiEmitter implementation of the EmitterInterface can be used thus:
$response = new Laminas\Diactoros\Response();
$response->getBody()->write("some content\n");
$emitter = new Laminas\Diactoros\Response\SapiEmitter();
$emitter->emit($response);
Emitting Ranges of streamed Files
The SapiStreamEmitter is useful when you want to emit a Content-Range. As an
example, to stream a range of bytes from a file to a client, the client can pass
the following header:
Range: bytes=1024-2047
Your application would then populate the response with a Content-Range header:
$range = $request->getHeaderLine('range');
$range = str_replace('=', ' ', $range);
$body = new Stream($pathToFile);
$size = $body->getSize();
$range .= '/' . $size;
$response = new Response($body);
$response = $response->withHeader('Content-Range', $range);
(Note: you will likely want to ensure the range specified falls within the content size of the streamed body!)
The SapiStreamEmitter detects the Content-Range header and emits only the
bytes specified.
$emitter = new SapiStreamEmitter();
$emitter->emit($response);
The SapiStreamEmitter may be used in place of the SapiEmitter, even when not
sending files. However, unlike the SapiEmitter, it will emit a chunk of
content at a time instead of the full content at once, which could lead to
performance overhead. The default chunk size is 8192 bytes.