PHP фред проблема - PullRequest
       32

PHP фред проблема

3 голосов
/ 15 октября 2010

У меня возникла проблема при создании сценария PHP telnet на работе для сбора сетевых данных.

, поскольку объем данных, возвращаемых командой 'Action: Status', может иметь любой размер ... imобеспокоен использованием статического числа с функцией fread () в строке 13. Я также попытался использовать функцию 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;
            }
        }
}

?>

Ответы [ 3 ]

4 голосов
/ 15 октября 2010
$data = '';
while (!feof($ami)) {
  $data .= fread($ami, 1024);
}

или в php5

$data = stream_get_contents($ami);
4 голосов
/ 15 октября 2010
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 голосов
/ 15 октября 2010

Просто используйте цикл и найдите «конец файла»

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

Возможно, вам следует рассмотреть возможность использования более мелких кусочков.

...