PHP-fread问题

PHP-fread问题,php,sockets,fread,fgets,Php,Sockets,Fread,Fgets,我在创建收集网络数据的PHP telnet脚本时遇到了一个问题 由于“Action:Status”命令返回的数据量可以是任意大小。。。我担心在第13行使用带有fread()的静态数字。我也尝试过使用fgets(),但它只获取第一行数据(元数据HTTP行…没有表)。如何使用PHP从套接字获取任意数量的数据?请帮忙 <?php $ami = fsockopen("192.100.100.180", 5038, $errno, $errstr); if (!$ami) { echo "ERRO

我在创建收集网络数据的PHP telnet脚本时遇到了一个问题

由于“Action:Status”命令返回的数据量可以是任意大小。。。我担心在第13行使用带有fread()的静态数字。我也尝试过使用fgets(),但它只获取第一行数据(元数据HTTP行…没有表)。如何使用PHP从套接字获取任意数量的数据?请帮忙

<?php
$ami = fsockopen("192.100.100.180", 5038, $errno, $errstr);

if (!$ami) {
echo "ERROR: $errno - $errstr<br />\n";
} else {

    fwrite($ami, "Action: Login\r\nUsername: 1005\r\nSecret: password\r\nEvents: off\r\n\r\n");

    fwrite($ami, "Action: Status\r\n\r\n");
    sleep(1);

    $record = fread($ami,9999);#this line could over run!!!
    $record = explode("\r\n", $record);
    echo "<META HTTP-EQUIV=Refresh CONTENT=\"9\">"; #refresh page every 9 seconds
    echo "<table  border=\"1\">";


    foreach($record as $value){
        if(!strlen(stristr($value,'Asterisk'))>0
        && !strlen(stristr($value,'Response'))>0
        && !strlen(stristr($value,'Message'))>0
        && !strlen(stristr($value,'Event'))>0
        && strlen(strpos($value,' '))>0) #remove blank lines
        php_table($value);;
    }

    echo "</table>";

    fclose($ami);
    }


function php_table($value){
        $row1 = true;
        $value = explode(" ", $value);
        foreach($value as $field){
            if($row1){
                echo "<tr><td>".$field."</td>";
                $row1 = false;
            }
            else{
                echo "<td>".$field."</td></tr>";
                $row1 = true;
            }
        }
}

?>

编辑:您的应用程序挂起,因为它没有关闭连接以表示HTTP请求的结束。试一试

fwrite($ami, "Action: Status\r\n\r\n"); 
fwrite($ami, "Connection: Close\r\n\r\n");
或者在php5中

$data = stream_get_contents($ami);

只需使用循环并查找“文件结尾”


你可能应该考虑使用较小的块。

最好用FEFF()来检查文件的末尾。谢谢撒乌耳,虽然你是正确的,它不再挂起。加载似乎需要85秒,这对于规范要求来说太长了。。事实上,在页面刷新(10秒)之前,该表从未加载过@JB87:即使在添加了“连接:关闭”之后,它也会加载85秒吗?谢谢,saul,现在正在测试您的编辑。星号AMI的正确语法是fwrite($AMI,“操作:注销\r\n\r\n”);它现在工作得很好!希望登录和注销系统以采集数据不会在将来导致问题,但感谢您发现我的这一关键错误。非常感谢您的解决方案。这帮我节省了很多时间。再次感谢。我已经尝试了这两种方法,两种方法都只是挂起阅读“等待本地主机”。。。。。在第一个示例中,我增加了块大小,但没有效果,可能是因为远程端没有关闭连接。在这种情况下,您将不得不使用fread变体,并自行决定何时停止。我明白了。。。但是,当它在处理循环连接的中间时,如何使它停止?在远程端的响应中必须有一些东西,指示它已经完成,并且只需查找它并中断它发生的循环,例如如果响应以“\r\n”终止:(SUBR($DATA,2)!= \ \r\n){$DATA=FRADD。($ami,1024);}即使有了这些大数据块,应用程序现在也挂起了。由于挂起了,远程设备也没有关闭连接。你可以做的是每次通过循环检查$record,看看你是否有你想要的,然后一旦你找到了,就爆发出来。如果有类似的问题,这可能会有帮助。谢谢phill,我尝试了用h进行测试但问题最终还是与让会议继续进行有关
$data = '';
while (!feof($ami)) {
  $data .= fread($ami, 1024);
}
$data = stream_get_contents($ami);
$record = '';
while( !feof( $ami ) ) {
    $record .= fread($ami,9999);
}