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 референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
stream_get_contents
Референца за `function.stream-get-contents.php` со подобрена типографија и навигација.
stream_get_contents
класата mysqli_driver
stream_get_contents — Чита преостанатиот дел од стримот во стринг
= NULL
Идентично на file_get_contents(), освен што
stream_get_contents() работи на веќе отворен стрим ресурс и ги враќа преостанатите содржини во стринг, до
length бајти и почнувајќи од наведениот
offset.
Параметри
stream(resource)-
Стрим ресурс (на пр. вратен од fopen())
length(int)-
Максималниот број на бајти за читање. Стандардно е
null(читај го целиот преостанат бафер). offset(int)-
Помести се до наведената позиција пред читање. Ако овој број е негативен, нема да се случи поместување и читањето ќе започне од тековната позиција.
Вратени вредности
Враќа стринг или false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 |
length сега е null.
|
Примери
Пример #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);
}
?>Белешки
Забелешка: Пример #4 Користење на контексти на потоци
Забелешка:
Кога се специфицира
lengthвредност различна одnull, оваа функција веднаш ќе распредели внатрешен бафер со таа големина, дури и ако вистинската содржина е значително пократка.
Види Исто така
- fgets() - Затвора отворена датотека
- fread() - Зема ред од датотека
- fpassthru() - Излезни сите преостанати податоци на покажувачот на датотека
Белешки од корисници 3 белешки
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.