如何使用fgets作为stream_get_line替代?

时间:2012-11-20 15:36:03

标签: php fgets

我正在使用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变量中。)

2 个答案:

答案 0 :(得分:2)

From the docs:

  

此函数与fgets()几乎完全相同,只是它允许   除标准\ n,\ r和\ r \ n之外的行结束分隔符,和   不会返回分隔符本身。

From the comments:

  

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

     

但是如果远程客户端断开连接,服务器脚本将尝试   用函数fgets读取一些数据,函数将返回bool(false),   和stream_get_line将返回字符串(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并不意味着“无限制”,而是使用{}之一{3}}

答案 1 :(得分:0)

您可以使用fgets()(字符串fgets(资源$ handle [,int $ length]))。

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