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, Ervinstream_get_contents
(PHP 5, PHP 7, PHP 8)
stream_get_contents — Reads remainder of a stream into a string
Description
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.
Parameters
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.
Return Values
Returns a string or false on failure.
Changelog
| Version | Description |
|---|---|
| 8.0.0 |
length is now nullable.
|
Examples
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);
}
?>Notes
Note: This function is binary-safe.
Note:
When specifying a
lengthvalue other thannull, this function will immediately allocate an internal buffer of that size even if the actual contents are significantly shorter.
See Also
- fgets() - Gets line from file pointer
- fread() - Binary-safe file read
- fpassthru() - Output all remaining data on a file pointer
User Contributed Notes 3 notes
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.