stream_get_contents

(PHP 5, PHP 7)

stream_get_contents残りのストリームを文字列に読み込む

説明

stream_get_contents ( resource $handle [, int $maxlength = -1 [, int $offset = -1 ]] ) : string

file_get_contents() と似ていますが、 stream_get_contents() は既にオープンしている ストリームリソースに対して操作を行います。そして、指定した offset から始まる最大 maxlength バイトのデータを取得して文字列に 保存します。

パラメータ

handle (resource)

ストリームリソース(例: fopen() の返す値)。

maxlength (integer)

読み込む最大バイト数。デフォルトは -1 (バッファの残りのデータをすべて読み込む)。

offset (integer)

読み込みを開始する前に移動する位置。負の数を指定した場合は移動が発生せず、 現在位置から読み込みを開始します。

返り値

文字列を返します。失敗した場合に FALSE を返します。

例1 stream_get_contents() の例

<?php

if ($stream fopen('http://www.example.com''r')) {
    
// オフセット 10 から開始して、残りのすべてのページを表示します
    
echo stream_get_contents($stream, -110);

    
fclose($stream);
}


if (
$stream fopen('http://www.example.net''r')) {
    
// 最初の 5 バイトを表示します
    
echo stream_get_contents($stream5);

    
fclose($stream);
}

?>

注意

注意: この関数はバイナリデータに対応しています。

参考

  • fgets() - ファイルポインタから 1 行取得する
  • fread() - バイナリセーフなファイルの読み込み
  • fpassthru() - ファイルポインタ上に残っているすべてのデータを出力する

add a note add a note

User Contributed Notes 5 notes

up
13
vasiliy at hotger dot com
8 years ago
It is important to know that stream_get_contents behaves differently with different versions of PHP. Consider the following

<?php

$handle
= fopen('file', 'w+'); // truncate + attempt to create
fwrite($handle, '12345'); // file position > 0
rewind($handle); // position = 0
$content = stream_get_contents($handle); // file position = 0 in PHP 5.1.6, file position > 0 in PHP 5.2.17!
fwrite($handle, '6789');
fclose($handle);

/**
*
* 'file' content
*
* PHP 5.1.6:
* 67895
*
* PHP 5.2.17:
* 123456789
*
*/
?>

As a result, stream_get_contents() affects file position in 5.1, and do not affect file position in 5.2 or better.
up
7
clarck dot smith at gmail dot com
8 years ago
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
up
2
m rahman
9 years ago
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.
up
0
Mike Shiyan
4 years ago
stream_get_contents() can be used instead of fread() even with local files.
up
-13
divinity76+nospam at gmail dot com
4 years ago
/*
* problem: stream_get_contents blocks / is very slow.
* I have tried
* 1: stream_set_blocking, doesn't make a difference.
* 2: stream_get_meta_data['unread_bytes'] = ITS BUGGED, ALWAYS SAYS 0.
* 3: feof(): ALSO EFFING BLOCKING
* 4: my_stream_get_contents hack... kinda working! :D
*/
function my_stream_get_contents ($handle, $timeout_seconds = 0.5)
{
    $ret = "";
    // feof ALSO BLOCKS:
    // while(!feof($handle)){$ret.=stream_get_contents($handle,1);}
    while (true) {
        $starttime = microtime(true);
        $new = stream_get_contents($handle, 1);
        $endtime = microtime(true);
        if (is_string($new) && strlen($new) >= 1) {
            $ret .= $new;
        }
        $time_used = $endtime - $starttime;
        // var_dump('time_used:',$time_used);
        if (($time_used >= $timeout_seconds) || ! is_string($new) ||
                 (is_string($new) && strlen($new) < 1)) {
            break;
        }
    }
    return $ret;
}
To Top