0

fsockopen 経由で telnet セッションを実行しているときに、stream_get_lineを使用して一部の PHP 出力を変数に格納しています。

ただし、私の 2 番目のサーバーは PHP5 を実行していないため、stream_get_lineを使用する機能が無効になっています。PHP 4.3 に代わるものはありますか?

fgetsもほぼ同じだと聞きましたが、 stream_get_lineとまったく同じようには動作しないようです。

コード:

...
# opening connection    
$fp = @fsockopen($ip, 23, $errno, $errstr, 8);
    # loggin in
    fputs($fp, "$user\r");
    usleep(250000);
    fputs($fp, "$password\r");

# getting information
fputs($fp, "show info\n");
usleep(250000);
fputs($fp, "show info 2\n");
usleep(250000);
fputs($fp, "show info 3\n");
usleep(250000);
fputs($fp, "show info 4\n");
usleep(250000);
fputs($fp, "?\n");

$content = stream_get_line($fp, 0, "?");
$contentvalues = array(
    1 => substr($content, 130, 3),
    2 => substr($content, 180, 3)
);

fclose($fp);
...

(出力の特定の部分を $contentvalues 変数に保存しています。)

4

2 に答える 2

2

ドキュメントから:

この関数は、標準の \n、\r、および \r\n 以外の行末区切り文字を許可し、区切り文字自体を返さない点を除いて、fgets() とほぼ同じです。

コメントから:

fgets が EOF に達したソケットからいくつかのバイトを読み取ると、stream_get_line と同じように bool(false) を返します。

ただし、リモート クライアントが接続を切断し、サーバー スクリプトが関数 fgets を使用してデータを読み取ろうとすると、関数は bool(false) を返し、stream_get_line は string(0) を返します ""

したがって、stream_get_line でリモート クライアントの切断を検出できますが、fgets では検出できません。

どちらの関数がより高速かについても多少の議論がありますが、それは PHP のバージョン、曜日、コメント投稿者が前夜の夕食に何を食べたかに依存しているようです。

編集

Steffen の回答に対するあなたの回答から判断するfgets()と、区切り文字として 3 番目のパラメーターを使用しないという事実に固執しています。基本的な入力ループを適用して文字列をチェックすると、そこにたどり着きます。また、Steffenの弁護では、「stream_get_lineとまったく同じように機能する」わけではないとだけ述べて、あなたの質問は決して明確ではありませんでした。

<?php
$delim = '?';
$buf = 4096;

$fp = @fsockopen($ip, 23, $errno, $errstr, 8);

// ... yadda yadda yadda ... //

$content = '';
while( $part = fgets($fp, $buf) ) {
    $ind = strpos($part, $delim);
    if( $ind !== false ) {
        $content .= substr($part, 0, $ind);
        break;
    }
    $content .= $part;
}

また、stream_get_line()ループを使用して入力をlengthパラメーターとして取得するか0、「無制限」を意味するのではなく、PHP のデフォルトの 8192 バイトを使用する必要があります。

于 2012-11-20T16:08:24.320 に答える
0

You can use fgets() (string fgets ( resource $handle [, int $length ] )) instead.

http://www.php.net/manual/de/function.fgets.php

于 2012-11-20T15:55:32.360 に答える