سؤال

واجهت مشكلة مع إنشاء نص PHP Telnet في العمل لجمع بيانات الشبكة.

نظرًا لأن كمية البيانات التي يتم إرجاعها من أمر "الإجراء: الحالة" يمكن أن يكون من أي حجم ... أنا قلق بشأن استخدام رقم ثابت مع 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;
            }
        }
}

?>
هل كانت مفيدة؟

المحلول

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");

نصائح أخرى

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

أو في PHP5

$data = stream_get_contents($ami);

فقط استخدم حلقة وابحث عن "نهاية الملف"

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

ربما يجب أن تفكر في استخدام قطع أصغر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top