Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Object-Oriented API for PHP streams
Branch: master

Merge pull request #6 from royopa/patch-1

add how to install with composer
latest commit 9c1f96e59e
@fzaninotto authored
Failed to load latest commit information.
Streamer Updated with indent probs
tests Add `Stream::getLine()`
.gitignore Initial Commit
LICENSE Initial Commit add
composer.json Initial Commit
phpunit.xml.dist Initial Commit


Streamer is an Object-Oriented API for PHP streams.

Why should I use Streams?

A stream is a flow of bytes from one container to the other. You already use streams a lot in PHP, for instance each time you load a file into memory (file_get_contents()). You should explicitly use streams each time that:

  • You need to access data from a container, but you don't know the size of this container (e.g. reading from STDIN, or a web service using streaming)
  • You need to start processing data from a container before the whole transfer is finished (e.g. start zipping a file before it's all in memory)
  • You need to save time and memory

What is Streamer?

PHP has a very elaborate stream API ; unfortunately, it uses functions for most stream operations (except for wrappers - go figure). Streamer is a generic library focusing on offering an object-oriented API to streams, and only that.


Streamer is published on, so you can add it to your composer.json file for an easy installation:

composer require fzaninotto/Streamer


    "require": {
        "fzaninotto/Streamer": "0.0.1"


use Streamer\Stream,

// basic usage
$stream = new Stream(fopen('smiley.png', 'r'));
$image = '';
while (!$stream->isEOF()) {
  $image .= $stream->read();

// pipe dreams!
$stream1 = new Stream(fopen('smiley.png', 'r'));
$stream2 = new Stream(fopen('tmp.png', 'w'));
// copy the contents from the first stream to the second one

// factory
$fileStream = FileStream::create('smiley.png', 'r');

$networkStream = NetworkStream::create('tcp://');


Streamer is heavily inspired by other Stream class implementations:

Something went wrong with that request. Please try again.