+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 16
  1. #1
    Registriert seit
    Feb 2007
    Ort
    Zwickau
    Beiträge
    5,490

    Arrow Hilfe zur Fehlerbehandlung

    In PHP intern gibt es verschiedene Schweregrade von Fehlermeldungen. Unterschieden werden diese in die Hauptkategorien Hinweis (E_NOTICE), Warnung (E_WARNING) und schwerwiegender Fehler (E_ERROR).
    Das mit der Version 2.1 eingeführte error_reporting = E_ALL zeigte bei mir einige unsauber erstellte Scripte auf. Um Fehler schneller zu finden und nicht das Logfile von IPS durchsuchen zu müssen oder nach dem Neustart der Konsole schnell den Zugriff auf aufgetretende Dinge zu haben, möchte ich hier eine Möglichkeit zeigen dies im Konsolenausgabefenster, Dashbaord oder Webfront zu machen.
    Dabei werden alle PHP Fehler in ein Logfile geschrieben. (Nur von PHP erzeugte Fehler!)

    1. folgende Einträge in der php.ini Kategorie [PHP] hinzufügen:
    Code:
    log_errors = On
    error_log  = C:\IP-Symcon_Ver2\error.log
    Der IPS Pfad ist natürlich entsprechend anzupassen.

    2. PHP Script anlegen+String Variable zur Ausgabe:
    PHP-Code:
    <?

        
    //-------------------------------------- ID´s -------------------------------

        
    $id_log_ausgabe               12345//ID der String Variable welche Fehler speichert

        //---------------------------------------------------------------------------
        
        
    $file =  IPS_GetKernelDir()."error.log";
        
    $logfile file_get_contents($file); //Logfile in variable einlesen
        
    SetValueString($id_log_ausgabe$logfile);
        echo 
    $logfile//Ausgabe in der Konsole
    ?>
    Für die Ausgabe im Dashboard habe ich einfach ein Memofeld benutzt.
    Geändert von Ferengi-Master (16.09.09 um 07:04 Uhr)
    MfG Thomas

    Eaton Xcomfort|FS20|1-Wire|Axis WebCams|WMRS200 Wetterstation|Funksystem-868|Gas und Wasserzähler per S0 1-Wire|E-Zähler per OKK+seriell2LAN Adapter|Amazon Alexa|
    Visu auf: 10"Touchscr.|Apple iPod Touch|Apple iPhone|Apple iPad|IPS V5.x|Dashboard|WebFront|iFront


  2. #2
    Registriert seit
    Jul 2008
    Beiträge
    43

    guter Ansatz - Alernative per eigenem error handler in einer autoprepend datei:

    in php.ini z.B. folgendes einfügen:
    PHP-Code:
    auto_prepend_file "d:/IPS2/scripts/autoprepend.php" 
    Hinweis: bei mir absoluter Pfad notwendig, da sonst webfront aussteigt

    in der datei autoprepend.php dann folgendes:
    PHP-Code:
    function userErrorHandler($errno$errmsg$filename$linenum$vars
    {
        
    $ce=error_reporting();
        if (
    $ce == 0) {return false;}   // sortiert fehlermeldungen, die eigentlich durch @ unterdrueckt werden sollten, aus

        
    $errortype = array (
                    
    E_ERROR              => 'Error',
                    
    E_WARNING            => 'Warning',
                    
    E_PARSE              => 'Parsing Error',
                    
    E_NOTICE             => 'Notice',
                    
    E_CORE_ERROR         => 'Core Error',
                    
    E_CORE_WARNING       => 'Core Warning',
                    
    E_COMPILE_ERROR      => 'Compile Error',
                    
    E_COMPILE_WARNING    => 'Compile Warning',
                    
    E_USER_ERROR         => 'User Error',
                    
    E_USER_WARNING       => 'User Warning',
                    
    E_USER_NOTICE        => 'User Notice',
                    
    E_STRICT             => 'Runtime Notice',
                    
    //E_RECOVERABLE_ERROR  => 'Catchable Fatal Error'
                    
    );

        
    $errname=$errortype[$errno];
        
    $dt date("d.m.Y H:i:s");
        
    $err=$dt." | ".$errname." ".$errno." | ".$errmsg." | ".$filename." | line:".$linenum."\r\n";

        
    $contents=$err.GetValueString(32407);  // hier id der IPS string variablen angeben, in der der log gespeichert werden soll
     
        
    if (substr_count($contents,"\r\n") > 50) {  // wenn mehr als 50 zeilen, dann die letzten 10 loeschen
        
    $xx=explode("\r\n",$contents);
        for (
    $i 1$i <= 10$i++) {
            
    array_pop($xx);
        } 
        
    $contents=implode("\r\n"$xx);  // hier id der IPS string variablen angeben, in der der log gespeichert werden soll
        
    }
        
    SetValueString(32407,$contents);   
        
    error_log($err3,IPS_GetKernelDir()."errorlog/error.log");  // sepcihert error in log datei
        
    return false;
    }
    $old_error_handler set_error_handler("userErrorHandler",6); 
    Die letzte Zeile, die wegen autoprepend von jedem script zuallererst ausgeführt wird, biegt den php error handler auf den eigenen "userErrorHandler" um, in dem man dann auf den Fehler reagieren kann, wie man will.

    "return false" bewirkt, dass in jedem Fall danach noch an den php eigenen error handler weitergeleitet wird

    Anzeige des Logs im Designer dann mit MemoFeld auf Stringvaraibale 32407 (ggf. ID ersetzen) - wie im vorherigen Beitrag gezeigt.

    Der usererrorhandler kann z.B. dann auch genutzt werden, um Fehlerklassen zu filtern und bei kritischen Fehlern z.B. auch automatisch eine email zu versenden - siehe PHP Dokumentation

    Viele Grüße
    Dirk

  3. #3
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,331

    Standard Anzeige für Webfront

    hier noch mal eine Variante zum löschen der Logdatei.


    • DummyInstanz anlegen
    • Stringvariable mit Profil ~HTML_Box anlegen
    • Boolvariable mit eigenem Profil anlegen
    • IPS-Dienst beenden
    • php.ini anpassen und speichern, Dienst starten

    Code:
    register_globals = on
    error_reporting = E_ALL
    log_errors = On
    error_log = C:\IP-Symcon\error.txt
    Ids der Variablen im Script anpassen. Boolvariable dem Script zuweisen(Eigene Aktion). Script verstecken. Ereignis dem Script hinzufügen.

    Bei klick auf die Boolvariable wird die Logdatei gelöscht und bei einem Fehler wieder neu angelegt und angezeigt.

    PHP-Code:
    <?
    $logAusgabe 
    31555 /*[System Error Logs\Meldungen]*///ID String HTML-Box Variable welche Fehler speichert
    $reset 35687 /*[System Error Logs\Log]*/// ID Boolvariable Log

    if(file_exists(IPS_GetKernelDir()."error.txt"))
    {
       
    $file IPS_GetKernelDir()."error.txt";
       
    $logfile file($file);
       
    $log "";
       foreach(
    $logfile as $lines => $line)
        {
            
    $log .= "<p>"."Meldung ".$lines."<b style='color:#FF0000;'> ".$line."</b><br></p>";
       }
       
    SetValue($logAusgabe$log);
        
    SetValue($resetfalse);
    }

    if(
    $IPS_SENDER == "WebFront")
    {
        if(
    file_exists(IPS_GetKernelDir()."error.txt"))
        {
           
    unlink(IPS_GetKernelDir()."error.txt");
           
    SetValueString($logAusgabe"");
            
    SetValue($resettrue);
        }
    }

    ?>
    Geändert von RWN (09.12.10 um 14:32 Uhr)
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  4. #4
    Registriert seit
    Sep 2007
    Ort
    Bodensee
    Beiträge
    954

    Hallo Rainer,

    wenn ich die Änderungen in der php.ini wie oben angegeben umsetze, gehen meine WebFronts nicht mehr??
    Hast Du ne Ahnung, was da los sein kann?

    Gruß
    dfhome
    HM via piVCCU3

  5. #5
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,331

    Wie sieht denn deine ini aus.
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  6. #6
    Registriert seit
    Jul 2006
    Ort
    Butzbach, die schöne Wetterau
    Beiträge
    1,475

    Die ini sollte nicht wie oben gezeigt aussehen, sondern ergänzen oder ändern.
    Alles andere so lassen wie es ist.
    Gruß Uwe
    (bmwm3)


  7. #7
    Registriert seit
    Sep 2007
    Ort
    Bodensee
    Beiträge
    954

    Hi,
    ja, natürlich hab ich nur ergänzt.
    Hier mal meine ini ohne die Änderungen:

    Code:
    extension_dir=C:\IP-Symcon\ext\
    extension=php_imap.dll
    [PHP]
    register_globals=on
    error_reporting=E_ALL
    max_execution_time=30
    extension_dir=C:\IP-Symcon\ext
    extension = php_curl.dll
    extension = php_gd2.dll
    extension = php_gettext.dll
    extension = php_imap.dll
    extension = php_soap.dll
    [DATE]
    date.timezone="Europe/Berlin"
    HM via piVCCU3

  8. #8
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,331

    die stimmt doch auch schon nicht. Da ist etwas doppelt:

    so sollte sie in etwa aussehen. entsprechend deiner Extension.

    Code:
    [PHP]
    extension_dir =C:\IP-Symcon\ext
    max_execution_time = 180
    register_globals = on
    error_reporting = E_ALL
    log_errors = On
    error_log = C:\IP-Symcon\error.txt
    extension = php_curl.dll
    extension = php_gd2.dll
    extension = php_gettext.dll
    extension = php_http_ips.dll
    extension = php_mbstring.dll
    extension = php_mysql.dll
    extension = php_pdo_sqlite.dll
    extension = php_soap.dll
    extension = php_sockets.dll
    extension = php_sqlite.dll
    [DATE]
    date.timezone = "Europe/Berlin"
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  9. #9
    Registriert seit
    Sep 2007
    Ort
    Bodensee
    Beiträge
    954

    Grad nochmal weitergetestet: wenn ich die Pfadangabe weg lasse, funktioniert wieder alles...?

    Nachtrag: wenn ich es so wie oben mache, klappt´s, Danke. Frag mich nur, wo das außerhalb der PHP-Deklaration herkommt...

    Aber vielen Dank für die schnelle Hilfe! :-)
    Geändert von dfhome (09.12.10 um 19:39 Uhr)
    HM via piVCCU3

  10. #10
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,331

    Standard mit Sprachausgabe und Notifier

    IDs anpassen. Sounddatei und Image anpassen.

    PHP-Code:
    <?
    // IDs der Variablen/Instanzen/Timer anpassen!
    $logID 31555 /*[System Error Logs\Meldungen]*///ID String HTML-Box Variable welche Fehler speichert
    $resetID 35687 /*[System Error Logs\Log]*/// ID Boolvariable Log
    $timer 32038 /*[System Error Logs\ErrorLogs\]*/;
    $event 46748 /*[System Error Logs\ErrorLogs\]*/;
    $mpID 34902 /*[.Sprachausgabe\Media Player]*/;
    $wfcID 43661 /*[WebFront Configurator]*/;
    $ttsID 28627 /*[.Sprachausgabe\Text To Speech]*/;

    if(
    $IPS_SENDER == "WebFront")
    {
        if(
    file_exists(IPS_GetKernelDir()."error.txt"))
        {
           
    unlink(IPS_GetKernelDir()."error.txt");
           
    SetValue($logID"");
            
    SetValue($resetIDtrue);
            
    IPS_SetScriptTimer($IPS_SELF0);
        }
    }

    if(
    $IPS_SENDER == "TimerEvent")
    {
        if(
    $IPS_EVENT == $event)
        {
            if(
    file_exists(IPS_GetKernelDir()."error.txt"))
            {
               
    $logfile file(IPS_GetKernelDir()."error.txt");
               
    $log "";
               foreach(
    $logfile as $lines => $line)
                {
                    
    $log .= "<p>Meldung ".$lines."<b style='color:#FF0000;'> ".$line."</b></p>";
               }
               
    SetValue($logID$log);
                
    SetValue($resetIDfalse);
                
    $time date("H:i");
                if((
    $time "23:00") || ($time "05:00")) 
                {
                   
    WFC_SendNotification($wfcID"*** Systemmeldung ***""PHP Fehler!""File_Edit_32"10);
                }
                else
                {
                   
    IPS_SetScriptTimer($IPS_SELF3);
                    
    WAC_SetVolume($mpID100);
                    
    WAC_PlayFile($mpID"media/Airport_Gong.mp3");
                    
    WFC_SendNotification($wfcID"*** Systemmeldung ***""PHP Fehler!""File_Edit_32"10);
                }
            }
        }
        if(
    $IPS_EVENT == $timer)
        {
           
    TTS_Speak($ttsID"Systemmeldung"false);
           
    IPS_SetScriptTimer($IPS_SELF0);
        }
    }

    ?>
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


Ähnliche Themen

  1. TGS-822 Gassensor an DS2438 (Hilfe benötigt)
    Von Joe im Forum Bastel-Ecke
    Antworten: 4
    Letzter Beitrag: 23.01.12, 22:45
  2. Wärmemenge Hilfe!
    Von Knäcke im Forum Haustechnik
    Antworten: 11
    Letzter Beitrag: 29.05.09, 18:54
  3. Hilfe Bewässerung
    Von steiner im Forum Haustechnik
    Antworten: 0
    Letzter Beitrag: 18.09.08, 12:43
  4. HILFE !! Script fehler meldung braue mal start hilfe
    Von Professorakiera im Forum Haustechnik
    Antworten: 23
    Letzter Beitrag: 28.03.07, 15:23