Download the PHP package hoa/stream without Composer
On this page you can find all versions of the php package hoa/stream. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
All versions of stream with dependencies
Informations about the package stream
Hoa is a modular, extensible and
structured set of PHP libraries.
Moreover, Hoa aims at being a bridge between industrial and research worlds.
This library is a high-level abstraction over PHP streams. It includes:
- Stream manipulations: Open, close, auto-close, timeout, blocking mode, buffer size, metadata etc.,
- Stream notifications: Depending of the stream wrapper, the
supported listeners are the following:
- Context: Allow to pass options and parameters to the stream wrappers, for instance HTTP headers,
- Filter: A function that sits between the source and the destination of a stream, useful for instance to encrypt/decrypt a data on-the-fly, or for more advanced tricks like instrumentation,
- Wrapper: Declare user-defined protocols that will naturally be
handled by the PHP standard library (like
- Interfaces: One interface per capability a stream can offer.
For more installation procedures, please read the Source page.
Before running the test suites, the development dependencies must be installed:
Then, to run all the test suites:
For more information, please read the contributor guide.
As a quick overview, we propose to discover what
in term of interfaces, i.e. stream capabilities. This is almost the
most important part of this library. Then, how to define a stream,
followed by how to use stream contexts. Events, listeners and
notifications will be detailed in the next section. Finally, wrappers
and filters are detailed in the last sections.
Interfaces, aka stream capabilities
This library defines several interfaces representing important stream
capabilities. This is very useful when designing a function, or a
library, working with streams. It ensures the stream is typed and
offers certain capabilities. The interfaces are declared in the
In, to read from a stream, provides
Out, to write onto a stream, provides
Bufferable, for streams with at least one internal buffer, provides
Touchable, for “touchable” streams, provides
Lockable, to lock a stream, provides
lockand several constants representing different kind of locks, like
Pathable, for path-based stream, provides
Pointable, to move the internal pointer of the stream if any, provides
Statable, to get statistics about a stream, provides
Structural, for a structural stream, i.e. a stream acting like a tree, provides
Thus, if one only need to read from a stream, it will type the stream
Hoa\Stream\IStream\In. It also allows an implementer to choose
what capabilities its stream will provide or not.
Finally, the highest interface is
Stream, defining the
method, that's all. That's the most undefined stream. All capabilities
must extend this interface.
Define a concrete stream
Hoa\Stream\Stream class is abstract. Two method
implementations are left to the user:
_open and :
respectively to open a particular stream, and to close this particular
stream, for instance:
Then, the most common usage will be:
That's all. This stream has no capability yet. Let's implement the
Other methods are left as an exercise to the reader. Thus, we are now able to:
Stream capability is already implemented by the
A context is represented by the
Hoa\Stream\Context class. It
represents a set of options and parameters for the stream.
See the options and parameters for the
http:// stream wrapper
as an example of possible ones. Thanks to context, this is possible to
add HTTP headers for instance, or to specify the proxy, the maximum
number of redirections etc. All these information are
options/parameters of the stream.
To use them, first let's define the context:
And thus, we can ask a stream to use this context based on the chosen context ID, like this:
For the stream implementer, the
methods on the
Hoa\Stream\Context class will be useful to
respectively retrieve the options and the parameters, and acts
according to them.
The concept of options and parameters are defined by PHP itself.
Events, listeners, and notifications
A stream has some events, and several listeners. So far, listeners mostly represent “stream notifications”.
2 events are registered:
hoa://Event/Stream/<streamName>:close-before. Thus, for instance, to
execute a function before the
/path/to/file stream closes, one
Remember that a stream is not necessarily a file. It can be a socket, a WebSocket, a stringbuffer, any stream you have defined… Consequently, this event can be used in very different manner for various scenario, like logging things, closing related resources, firing another event… There is no rule. The observed stream is still opened, and can theoritically still be used.
This event is fired when calling the
Now let's move on to listeners. To register a listener, we must create
an instance of our stream without opening it. This action is called
“deferred opening”. We can control the opening time with the third
argument of the default
defer the opening, like:
null as a second argument means: No context. Note that we
must manually call the
open method to open the stream then. Between
the stream instanciation and the stream opening, we can attach new
Depending of the stream implementation, different listeners will be fired. The term “listener” is the one used everywhere in Hoa, but PHP —in the context of stream— refers to them as notifications. Let's take an example with an HTTP stream:
You might see something like this:
The exhaustive list of listeners is the following:
authrequire, when the authentication is required,
authresult, when the result of the authentication is known,
complete, when the stream is complete (meaning can vary a lot here),
connect, when the stream is connected (meaning can vary a lot here),
failure, when something unexpected occured,
mimetype, when the MIME-type of the stream is known,
progress, when there is significant progression,
redirect, when the stream is redirected to another stream,
resolve, when the stream is resolved (meaning can vary a lot here),
size, when the size of the stream is known.
All listener bucket data is an array containing the following pairs:
code, one of the
STREAM_NOTIFY_*constant, which is basically the listener name (see the documentation),
severity, one of the
STREAM_NOTIFY_SEVERITY_INFO, normal, non-error related, notification,
STREAM_NOTIFY_SEVERITY_WARN, non critical error condition, processing may continue,
STREAM_NOTIFY_SEVERITY_ERR, a critical error occurred, processing cannot continue.
message, a string containing most useful information,
transferred, amount of bytes already transferred,
max, total number of bytes to transfer.
This is possible for the stream implementer to add more
listeners. Please, take a look at
Hoa\Event library. Not
all listeners will be fired by all kind of streams.
A stream wrapper allows to declare schemes, like
fortune://. You can imagine adding your favorite online storage too,
cloud://. Any stream wrapper can be used with native standard PHP
touch etc. It
will be transparent for the user.
Hoa\Stream\Wrapper\Wrapper class holds all methods to
restore wrappers. The
getRegistered methods are also helpful. A wrapper is represented by a class:
A wrapper must implement the
interface. It is a combination of two other interfaces in the same
Stream interface requires to implement several methods related to a stream, such as:
The API provides all required information.
File interface requires to implement other methods related to stream acting as a file, such as:
An example of an implementation is the
hoa:// scheme in
It does not depend on this library to avoid dependencies, but the code
can be helpful.
A stream is like a pipe, with an input, and an output. This is
possible to cut this pipe in two pieces, and insert a small part: A
filter. There are three types of filter, identified by constants on
Filter::READwhen the filter applies for reading operations,
Filter::WRITEwhen the filter applies for writing operations,
This class allows to
remove filters. A filter takes
the form of a class extending the
and an associated name. This is not mandatory but highly encouraged.
Once a filter is registered, we can apply it on a stream by using its
name, with the
prepend methods. You might guess that
several filters can be applied on a stream, in a specific order, like
“decrypt”, “unzip”, “transform to…”. In such a scenario, the order
Finally, we use the stream as usual. A stream is not necessarily an
Hoa\Stream, it can be any PHP stream resources. Passing
Hoa\Stream instance will obviously unwraps to its underlying PHP
Let's implement a filter that changes the content of the stream into uppercase. We start by defining out filter:
Great. Now let's register our filter under a specific name:
Then, we must apply the filter on a specific stream, so let's open a stream, and append the filter:
This filter has been applied for reading operations only. So we will see its effect when reading on our stream, let's do it:
You will see everything in ASCII uppercase.
A filter is a low-level stream API. It integrates with all kind of
streams. And this is a very powerful tool. We mentionned some usages
like decrypt, transform to, unzip… Actually, PHP comes with certain
standard filters, like:
convert.iconv.* etc. The
Hoa\Stream\Filter\Filter::getRegistered method will provide the list
of all registered filters.
Hoa\Stream\Filter\LateComputed class is a special filter. It
calls its public
compute method when the stream reaches its end. So
by extending this filter, you can override the
compute method and
works on the
_buffer attribute. This buffer contains the whole
content of the stream. This is really a buffer. Why would it be
useful? For instance if you are reading a PHP file, you can transform
the source code on-the-fly by using a parser —for instance— and
rewrite parts of the file. This technique is particularily useful to
instrument codes (adding some probes).
This is also possible to auto-apply a filter with… a wrapper! For
instrument:// wrapper can prepend a filter to the stream
being opened with the
stream_open method (from the
Possibilities are numerous.
There are more to cover.
Hoa\Stream supports composite streams (with
Hoa\Stream\Composite abstract class), i.e. streams embedding
other streams, like
An XML stream reads and writes from another inner stream (a file, a
socket, or anything else).
allows a string to be manipulated with a stream API, so the stream
content is written on the disk. Stream capabiilities are not the same
Hoa\File as you might guess.
hack book of
detailed information about how to use this library and how it works.
To generate the documentation locally, execute the following commands:
More documentation can be found on the project's website: hoa-project.net.
There are mainly two ways to get help:
Do you want to contribute? Thanks! A detailed contributor guide explains everything you need to know.
Hoa is under the New BSD License (BSD-3-Clause). Please, see
LICENSE for details.
The following projects are using this library: