2010-10-15 60 views
2

我在工作中創建一個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

回答

4
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

4
$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

0

只需使用一個循環,並尋找

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

你或許應該考慮使用更小的塊 「文件尾」。

+0

即使有了這些大塊,應用程序現在仍然無限期掛起 – JB87 2010-10-15 14:48:43

+0

好的。由於掛起,遠程沒有關閉連接。你可以做的是每次循環檢查$記錄,看看你是否有你想要的東西,然後一旦出現就爆發了。 – Cfreak 2010-10-15 15:10:52