Php-Script erzeugt Warnung! Warum?

Das nachfolgende Script wird jede Sekunde ausgeführt und erzeugt folgenden Eintrag in die Meldungen und das Logfile:

15.12.2017 18:17:06 | 42591 | WARNING | ScriptEngine         | Ergebnis für Ereignis 18762

Wenn ich das Script manuell ausführe, wird in der Konsole das Ausgabefenster leer geöffnet.
Ich versuche diese Ausgabe zu unterdrücken, habe auch schon div. Zeilen mit „@“ versehen, aber ohne Erfolg.

Hie das Script:

<?
//vollständiges Array pro Plane  Dezimalwerte kommen mit Komma ?
$plane = array(
    'hex' => "406c43",
    'squawk' => 2750 ,
    'flight' => "CFE5EF"  ,
    'lat' => 49.038593,
    'lon' => 7.348047,
    'nucp' => 7,
    'seen_pos' => 0.8,
    'altitude' => 38000,
    'vert_rate' => -64,
    'track' => 315,
    'speed' => 447,
    'messages' => 790,
    'seen' => 0,
    'rssi' => -34.9
);
$disp = array();
$ergebnis = array() ;
//print_r($plane);

// 1.Step alten Wert laden--------------------------------------------------------
//$updated = unserialize(GetValue(26477 /*[Plane auswählen nach Entfernung \Aircraft updated auffüllen\aircraft updated]*/));
//$updated = Sys_GetURLContent("http://192.168.1.136:8080/data/updated.json"); 
$handle = fopen ("/run/dump1090-mutability/updated.json",'r');
$updated = fread ($handle,filesize("/run/dump1090-mutability/updated.json"));
fclose ($handle);

$updated = json_decode($updated, true);  // $json_string in ein Objekt $json überführen.
//print_r($updated);

// 2.ter Step: Polling------------------------------------------------------------

$json_string = Sys_GetURLContent("http://192.168.1.136:8080/data/aircraft.json");  
$json = json_decode($json_string, true);  // $json_string in ein Objekt $json überführen.
$zeit = intval($json['now']);
$aircraft =  ($json['aircraft']);    // Nur das aircraft-array ohne Zeit und Summe Meldungen

// 2.1 Zeit verarbeiten
SetValue(49642 /*[Plane auswählen nach Entfernung \Zeit now]*/, $zeit);
//echo $zeit . "
";

// 3.ter Step nach Feld hex sortieren----und Zeit reinbringen---------------------
$i = 0 ;
foreach ($aircraft as $nr => $inhalt)
{    $aircraft[$i]['zeit'] = $zeit ;
    $i++;    
    $hex[$nr] = strtolower($inhalt['hex']);
}
array_multisort($hex, SORT_ASC, $aircraft);
// Aktuelle Daten sortiert nach hex speichern
 //print_r($aircraft[0]);
//setvalue(51562 /*[Plane auswählen nach Entfernung \Aircraft updated auffüllen\aircraft found]*/, serialize($json['aircraft']));
//Bis hierher läuft es _______________________________________erledigt____________
//$updated = $aircraft;    // zum Test neu füllen
//---------------------------------------------------------------------------------

// 4.ter Step Verarbeitung $json['aircraft']---------------------------------------

//ersetzen($aircraft, $updated, $zeit);    // alle Felder aus aircraft.json in $updated integrieren
 $iu = 0;                // array $updated zählen zum späteren Anhängen
 foreach ($updated as $nr => $inhalt)
    {    $iu++;    
    }
//--------------------------------------------------------------------------------
foreach ($aircraft as $satz)
{    $gefunden = false ;
    
    foreach ($updated as &$ziel)
    {
        
        if ($satz['hex'] == $ziel['hex'])
        {
            $ziel = array_replace($ziel, $satz);  //wird diese Zeile ausgeschaltet wird das alte Updated gezeigt.
            //unset($ziel);
            $gefunden = true ;
        }
    }
    // -> neue Sätze hinzufügen
    if (!$gefunden)
    {
    $updated[$iu++] = $satz ;
    //print_r($satz) ;
    }

}

//$updated = $aircraft;   // für Testzwecke---------------------------------------

//4.3 alte Sätze löschen und $updated sortieren
//     Zeit jetzt - 60 Sekunden
$loeschzeit = 120 ;
$iu = 0 ;
foreach ($updated as &$ziel)
{    if (isset($updated[$iu]['zeit']))
    {
        if ($updated[$iu]['zeit'] <= (time() -$loeschzeit))    {
            unset ($updated[$iu]) ;
            
        }
    }
    else
    {
        unset ($updated[$iu]) ;
    }
    $iu++ ;
}
 //print_r($updated);
 //updated sortieren--------------------------------------------------------------
 $iu = 0;
 $ilat = 0 ;
 foreach ($updated as $nr => $inhalt)
{    $iu++;    
    $hexu[$nr] = strtolower($inhalt['hex']);
    // Sätze mit Positionen und Höhe
    if (isset($inhalt['lat']) && isset($inhalt['altitude']))
     {$ilat++;}
}
array_multisort($hexu, SORT_ASC,SORT_STRING, $updated);        // SORT_DESC für absteigend SORT_String wichtig
SetValue(43272 /*[Plane auswählen nach Entfernung \Aircraft updated auffüllen\Lat und Altitude found]*/, $ilat);  // um Speicher zu sparen

// 5. ter Step    Speichern---------------------------------------------------------
ausgeben($updated,$aircraft, $ergebnis);
//setvalue(26477 /*[Plane auswählen nach Entfernung \Aircraft updated auffüllen\aircraft updated]*/, serialize($updated));

$handle = fopen ("/run/dump1090-mutability/updated.json",'w');
fwrite($handle, json_encode($updated));
fclose($handle);


// Ende der Verarbeitung Jetzt kommen nur Funktionen-------------------------------
// Funktionen---------------------------------------------------------------------
//________________________________________________________________________________

// Display im Webbrowser-----nur dies sonst nix-----------------------------------
function ausgeben($updated, $aircraft,$ergebnis)    //wird genutzt
{    // $updated-------------------------------------------------------------------
    $ausg = "" ;
    foreach ($updated as $zeile)    {
        if ($zeile['seen'] <> 6000)         {
            if (!isset($zeile['zeit']))    {
                $zeile['zeit'] = 1507200000 ;
            }
            else    {
                if ($zeile['zeit'] == 0)    {
                    $zeile['zeit'] = 1507200000 ;
                }
            }
            if (!isset($zeile['lat']))    {
                $zeile['lat'] = 0;
            }
                    if (!isset($zeile['altitude']))    {
                $zeile['altitude'] = 0;
            }
                $ausg = $ausg . " zeit ". (intval($zeile['zeit'])-    1507200000) . " hex: " . $zeile['hex'] . " Lat: " . intval($zeile['lat'] *100)/100 . " Alt: " . $zeile['altitude'] . " s.: ". $zeile['seen'].  "
" ;
                //echo($ausg);
            
        }
    }  
    setvalue(20983 /*[Plane auswählen nach Entfernung \Disp Updated\Display updated]*/, $ausg);
    unset($zeile);
    // $aircraft------------------------------------------------------------------
    $ausg = "" ;
    foreach ($aircraft as $zeile)    {
        if ($zeile['seen'] <> 6000)         {
            if (!isset($zeile['lat']))    {
                $zeile['lat'] = 0;
            }
            if (!isset($zeile['altitude']))    {
                $zeile['altitude'] = 0;
            }
                $ausg = $ausg . " zeit ". (intval($zeile['zeit'])-1507200000) . " hex: " . $zeile['hex'] . " Lat: " . intval($zeile['lat']*100)/100 . " Alt: " . $zeile['altitude'] . " s.: ". $zeile['seen'].  "
" ;
                //echo($ausg);
            
        }
    }  
    setvalue(20486 /*[Plane auswählen nach Entfernung \Disp Aircraft\Display Aircraft]*/, $ausg);

    // $ergebnis----------------------------------------------------------------------
    $ausg = "" ;
    foreach ($ergebnis as $zeile)    {
        //if ($zeile['seen'] <=6000)         {
            if (isset($zeile['lat']))    {
                $zeile['lat'] = 0;
            }
            if (isset($zeile['altitude']))    {
                $zeile['altitude'] = 0;
            }
                //$ausg = $ausg . " zeit ". (intval($zeile['zeit'])-1507200000) . " hex: " . $zeile['hex'] . " Lat: " . intval($zeile['lat']*100)/100 . " Lon: " . " Alt: " . $zeile['altitude'] . " s.: ". $zeile['seen'].  "
" ;
                //echo($ausg);
        //    }
        
    }  
    setvalue(39564 /*[Plane auswählen nach Entfernung \Jason Mix erledigt\Test Ergebnis]*/ , $ausg);
}

?>  

Edit: Eben gepostet und jetzt habe ich den Fehler nach wochenlanger Suche gefunden:

Ein Leerzeichen nach "?> " hat es verursacht.

Ist das Skript nach ?> leer, oder haben sich da Leerzeichen oder Leerzeilen eingeschlichen?

Edit: Zu langsam … :slight_smile:

Da es offensichtlich immer wieder vorkommt: Könnte man nicht dem Editor beibringen, dies automatisch zu bereinigen?

Wenig sinnvoll, gibt ja auch Scripte welche absichtlich z.b. HTML ausgeben.
Soll er dass dann auch entfernen?
Besser wäre es der Editor erzeugt neue Scripte ohne das schließende ?> , PHP braucht das nicht.
Die kann man sonst auch selber entfernen und dann passiert einem das mit der leeren Ausgabe auch nicht mehr ausversehen.
Michael

Michael, es scheint doch ein klares Muster zu geben, daß Leerzeichen nach „?>“ am Dateiende regelmässig zu Problemen führen und langwierige Fehlersuche nach sich ziehen.

Bei einem Produkt, wo es um Automatisierung (!) geht, sollte das irgendwie automatisch gelöst werden. Ist ja keine Marsmission, sondern eher ein triviales Problem, das nur deshalb nervt, weil man als Mensch die Leerzeichen im Editor nicht sieht.

Cheers,
Volker

Man sollte einfach vermeiden, dort Leerzeichen zu setzen. Von alleine kommen die da ja schließlich nicht hin.

Diese Thematik geistert hier schon so lange und so oft durch dieses Forum, dass es sie bis zu einem Sonderstatus geschafft hat: Klick

Nee, die sind sicherlich beim Copy & Paste von Codeschnipseln ungewollt mit übernommen wurden und schwer erkennbar weil „unsichtbar“.

Für die Softwareprodukte meiner Firma sind wir sehr bemüht, solche wiederkehrenden Stolperfallen zu vermeiden. Etwas Mehrarbeit für die Programmierer, dafür weniger Probleme beim Nutzer. Da IPS nicht mein Produkt ist soll’s mir egal sein, ich wundere mich nur immer wieder …