some times this functions cause an max execution time time error, Why?
Simple, if you use it the function wait for have the specified byte length into the resource or the end of file, but, several times this not happend, so we need implement an artificial flag like this:
$tmp = stream_get_contents($this->socket, 42);
while($tmp[42] != 'N'){
//Your code...
$tmp = stream_get_contents($this->socket, 42);
}
stream_get_contents
(PHP 5)
stream_get_contents — 残りのストリームを文字列に読み込む
説明
string stream_get_contents
( resource $handle
[, int $maxlength = -1
[, int $offset = 0
]] )
file_get_contents() と似ていますが、 stream_get_contents() は既にオープンしている ストリームリソースに対して操作を行います。そして、指定した offset から始まる最大 maxlength バイトのデータを取得して文字列に 保存します。
パラメータ
- handle (resource)
-
ストリームリソース(例: fopen() の返す値)。
- maxlength (integer)
-
読み込む最大バイト数。デフォルトは -1 (バッファの残りのデータをすべて読み込む)。
- offset (integer)
-
読み込みを開始する前に移動する位置。
返り値
文字列を返します。失敗した場合は FALSE を返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.1.0 | offset が追加されました。 |
例
例1 stream_get_contents() の例
<?php
if ($stream = fopen('http://www.example.com', 'r')) {
// オフセット 10 から開始して、残りのすべてのページを表示します
echo stream_get_contents($stream, -1, 10);
fclose($stream);
}
if ($stream = fopen('http://www.example.net', 'r')) {
// 最初の 5 バイトを表示します
echo stream_get_contents($stream, 5);
fclose($stream);
}
?>
注意
注意: この関数はバイナリデータに対応しています。
参考
- fgets() - ファイルポインタから 1 行取得する
- fread() - バイナリセーフなファイルの読み込み
- fpassthru() - ファイルポインタ上に残っているすべてのデータを出力する
stream_get_contents
finalmau at gmail dot com
29-Apr-2008 11:28
29-Apr-2008 11:28
Jim Keller
28-Aug-2006 08:04
28-Aug-2006 08:04
Per wez (at php.net), "the trick is to tell the recipient how big the packet is, so that it can read the correct length."
In my own experience, when using PHP streams to send data bursts, the "max length" parameter seems to act more as an exact length parameter, as the stream will block indefinitely until max length is reached or until the other side fcloses() the stream. The latter is ok unless you need to keep the stream open to continue communication, in which case you have to let the receiving end know how much data to expect, or it will block indefinitely if the max length of data is not sent. You need to pack() and prepend the length of the outgoing data stream in the first 4 bytes of the packet, as follows:
function send_pkt($stream, $my_data)
{
$len = strlen($my_data);
$send_data = pack('N', $len) . $my_data; //Pack the length in a network-friendly way, then prepend it to the data.
$final_len = strlen($send_data);
if ( fwrite($stream, $send_data) < $final_len ) {
//something went wrong, trigger error
}
}
function recv_pkt($stream)
{
$packed_len = stream_get_contents($stream, 4); //The first 4 bytes contain our N-packed length
$hdr = unpack('Nlen', $packed_len);
$len = $hdr['len'];
$recvd_data = stream_get_contents($stream, $len);
return $recvd_data;
}
