(PHP 5, PHP 7, PHP 8)
stream_get_contents — Reads remainder of a stream into a string
Identical to file_get_contents() , except that
stream_get_contents() operates on an already open
stream resource and returns the remaining contents in a string, up to
length
bytes and starting at the specified
offset
.
stream
(resource )A stream resource (e.g. returned from fopen() )
length
(int )
The maximum bytes to read. Defaults to null
(read all the remaining
buffer).
offset
(int )Seek to the specified offset before reading. If this number is negative, no seeking will occur and reading will start from the current position.
Returns a string or false
on failure.
Version | Description |
---|---|
8.0.0 |
length is now nullable.
|
Example #1 stream_get_contents() example
<?php
if ($stream = fopen('http://www.example.com', 'r')) {
// print all the page starting at the offset 10
echo stream_get_contents($stream, -1, 10);
fclose($stream);
}
if ($stream = fopen('http://www.example.net', 'r')) {
// print the first 5 bytes
echo stream_get_contents($stream, 5);
fclose($stream);
}
?>
Note: This function is binary-safe.
Note:
When specifying a
length
value other thannull
, this function will immediately allocate an internal buffer of that size even if the actual contents are significantly shorter.
In that case when stream_get_contents/fread/fgets or other stream reading functions block indefinitely your script because they don't reached the limit of bytes to read use the socket_get_meta_data function to figure out the number of the bytes to read. It returns an array that contains a key named 'unread_bytes' and then pass that number to your favourite stream reading functions second parameter to read from the stream.
Maybe a good workaround to use the stream_select function, and set the socket to non-blocking mode with the use of stream_set_blocking($stream, 0). In this case the socket reading functions work properly.
Cheers, Ervin
When omitting the parameter $maxlength, any received bytes are stacked up until the underlying stream is not readable anymore, the the function returns that stack in one piece.
In my case this is acting a little unpredictable, which may occur in your case as well depending on how the streams are set up.
This can be resolved by using the offset 0 (rather than the default -1), to ensure your streams are always read from the start, rather than the current position.