PHP fread问题

问题描述:

我在工作中创建一个PHP远程登录脚本以收集网络数据时遇到了问题。PHP fread问题

从'Action:Status'命令返回的数据量可以是任意大小...我关心在第13行使用带有fread()的静态数字。我也尝试过使用fgets()但它只抓取第一行数据(META 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; 
      } 
     } 
} 

?> 
+0

http://stackoverflow.com/questions/1405457/php-soap-fread-dynamic-post-size有一个类似的问题,这可能有助于 – 2010-10-15 14:54:52

+0

感谢phill,我试着测试头,但问题最终与离开会话打开 – JB87 2010-10-15 15:27:05

while (strlen($c = fread($fp, 1024)) > 0) { 
    $record .= $c; 
} 

编辑:您的应用程序挂起,因为它不关闭,以表示一个HTTP请求端的连接。尝试

fwrite($ami, "Action: Status\r\n\r\n"); 
fwrite($ami, "Connection: Close\r\n\r\n"); 
+0

更好地检查文件的结尾与feof() – Cfreak 2010-10-15 14:30:27

+0

不幸的是这个代码示例也挂起 – JB87 2010-10-15 14:55:27

+0

谢谢扫罗,虽然你是正确的,它不再挂起..它似乎需要约85secs加载这是实际上,在页面刷新之前表格从不加载(10secs) – JB87 2010-10-15 15:15:49

$data = ''; 
while (!feof($ami)) { 
    $data .= fread($ami, 1024); 
} 

或PHP5

$data = stream_get_contents($ami); 
+0

我已经尝试了这两种方法,并且都挂起阅读'等待本地主机'.....我已经增加了我的块大小的第一个示例,但它没有影响 – JB87 2010-10-15 14:47:27

+0

可能是因为远程端不关闭连接。在这种情况下,您将不得不使用fread变体并确定自己何时停止。 – 2010-10-15 14:51:23

+0

我明白了......但是如何在处理循环连接的过程中让它停止? – JB87 2010-10-15 14:54:00

只需使用一个循环,并寻找

$record = ''; 
while(!feof($ami)) { 
    $record .= fread($ami,9999); 
} 

你或许应该考虑使用更小的块 “文件尾”。

+0

即使有了这些大块,应用程序现在仍然无限期挂起 – JB87 2010-10-15 14:48:43

+0

好的。由于挂起,远程没有关闭连接。你可以做的是每次循环检查$记录,看看你是否有你想要的东西,然后一旦出现就爆发了。 – Cfreak 2010-10-15 15:10:52