我正在使用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变量中。)
答案 0 :(得分:2)
此函数与fgets()几乎完全相同,只是它允许 除标准\ n,\ r和\ r \ n之外的行结束分隔符,和 不会返回分隔符本身。
当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]))。