0

我正在使用stream_get_line将一些php 输出存储在一个变量中,而我正在通过fsockopen 运行一个telnet 会话。

但是,我的第二台服务器没有运行 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

从文档:

此函数与 fgets() 几乎相同,不同之处在于它允许使用标准 \n、\r 和 \r\n 以外的行尾分隔符,并且不返回分隔符本身。

从评论:

当 fgets 从 socket 读取一些字节时,到达 EOF,它返回 bool(false) 与 stream_get_line 相同

但是如果远程客户端断开连接,服务器脚本将尝试使用函数 fgets 读取一些数据,函数将返回 bool(false),stream_get_line 将返回 string(0) ""

因此您可以使用 stream_get_line 检测远程客户端断开连接,而无法使用 fgets

还有一些关于哪个函数更快的问题,但这似乎取决于 PHP 的版本、星期几以及评论者前一天晚上的晚餐。

编辑

从您对 Steffen 的回答的回答来看,您对fgets()不使用第三个参数作为分隔符的事实感到困惑。应用一个基本的输入循环并检查字符串会让你到达那里。此外,在 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 bytes

于 2012-11-20T16:08:24.320 回答
0

您可以使用 fgets() (string fgets ( resource $handle [, int $length ] )) 代替。

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

于 2012-11-20T15:55:32.360 回答