Compile Error: Cannot redeclare class IPSModule

Hallo,

ab und zu (leider habe ich noch nicht die Zusammenhänge finden können) erhalte ich beim Aufruf von IPSLogger_Inf() der IPSLibrary eine Fehlermeldung und die Verarbeitung des Scriptes bricht ab:

Nach meiner Beobachtung tritt der Fehler erst auf nachdem ich das SONOS Modul eingebunden habe. Ich kann aber auch falsch liegen.

Hat jemand eine Idee, was der Fehler bedeutet und was evtl. falsch laufen könnte?

Gruß

Burkhard

Irgendwas importiert die IPSModule klasse erneut. Warum der IPSLogger dies tun sollte wüsste ich aber nicht. Ergibt in der Tat nicht so viel Sinn…

paresy

@paresy:

Ich habe mal mit Notepad++ über die modules und scripts Verzeichnisse nach „__ipsmodule“ gesucht.

Aber die einzigen Stellen, die gefunden werden, sind:

 T:\scripts\__generated.inc.php (32 hits)
	Line 5: 	require_once('C:\IP-Symcon\scripts\__ipsmodule.inc.php');
	Line 12: 	require_once('C:\IP-Symcon\scripts\__ipsmodule.inc.php');
	Line 19: 	require_once('C:\IP-Symcon\scripts\__ipsmodule.inc.php');
	Line 26: 	require_once('C:\IP-Symcon\scripts\__ipsmodule.inc.php');
	...

Dass heißt für mich, dass niemand sonst die IPSModule Klasse erneut einbindet.

Im logfile findet sich der Eintrag übrigens auch:

06:03:39 | 52654 | WARNING | Register Variable    | <br />
<b>Fatal error</b>:  Cannot redeclare class IPSModule in <b>C:\IP-Symcon\scripts\__ipsmodule.inc.php</b> on line <b>16</b><br />
<br />
<b>Warning</b>:  Cannot detect ThreadID! in <b>C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php</b> on line <b>50</b><br />

Es tritt wohl in Zusammenhang mit der Register Variable 52654 auf. :confused:
Auch die Warning ‚Cannot detect ThreadID!‘ kann ich nicht einordnen. Auf der Zeile steht bei mir

		if (IPS_SemaphoreEnter(__FUNCTION__.$Directory.$File, 1000)){

Kannst du mit den zusätzlichen Infos etwas anfangen?

Gruß

Burkhard

Hallo paresy,

im Fall des

Warning: Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 50

bin ich ein Stück weitergekommen: Die Warnung kommt tatsächlich von IPS_SemaphoreEnter() im Fall eines Fatal error oder auch eines Parse Error.

In diesem Fall kann wohl kein Semaphore bekommen werden:confused:. Ich habe die Warning hier nun erst einmal mit ‚@‘ unterdrückt. Vielleicht kannst du einmal prüfen, ob das korrekt ist.

Das eigentliche Problem „Cannot redeclare class IPSModule“ taucht momentan nicht mehr auf. Werde ich weiter beobachten.

Gruß

Burkhard

Kannst du das mit dem „Cannot detect threadid“ nachstellen? Also ein kleines Skript, welches den Fehler produziert?

paresy

Kein Problem. Voraussetzung ist ein installierter IPSLogger der Library und eine Erweiterung in IPSLogger_WriteFile().

Da ich relativ viel logge, kam es in der Funktion immer wieder zu unvollständigen Fileeinträgen.
Somit habe ich zur Absicherung einen Semphor eingebaut:

	// ---------------------------------------------------------------------------------------------------------------------------
	function IPSLogger_WriteFile($Directory, $File, $Text, $ID_OutEnabled) {
		if ($Directory == "") {
			$Directory = IPS_GetKernelDir().'logs/';
			if (function_exists('IPS_GetLogDir'))
				$Directory = IPS_GetLogDir();
		}
      //Semaphor eingebaut. Da im Fall eines 'Parse Errors' kein Semaphor erhältlich ist ('Warning:  Cannot detect ThreadID!')
      //sollten die Warnings unterdrückt werden
      @IPS_SemaphoreEnter(__FUNCTION__.$Directory.$File, 1000);

      if(($FileHandle = fopen($Directory.$File, "a")) === false) {
         SetValue($ID_OutEnabled, false);
         @IPS_SemaphoreLeave(__FUNCTION__.$Directory.$File);
         Exit;
      }
      fwrite($FileHandle, $Text.c_lf);
      fclose($FileHandle);
      @IPS_SemaphoreLeave(__FUNCTION__.$Directory.$File);
	}

Entfernt man die Unterdrückung der Warnings (@) und lässt ein fehlerhaftes Skript laufen mit

echo "falsche Anführungszeichen';

kommt es in der Console zu der Fehlerausgabe

Parse error:  syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in C:\IP-Symcon\scripts\43660.ips.php on line 5

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 51

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 60

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 51

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 51

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 60

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 60
Abort Processing during Fatal-Error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN)
   Error in Script C:\IP-Symcon\scripts\43660.ips.php on Line 5

Gruß

Burkhard

Ah! Du nutzt die Funktion falsch. Du darfst ein Leave nur aufrufen, wenn vorher Enter korrekt lief. Außerdem verlierst du Meldungen, wenn das Timeout überschritten wird. (Zur Zeit nicht, da du es falsch nutzt)

Beispiel:


    function IPSLogger_WriteFile($Directory, $File, $Text, $ID_OutEnabled) { 
        if ($Directory == "") { 
            $Directory = IPS_GetKernelDir().'logs/'; 
            if (function_exists('IPS_GetLogDir')) 
                $Directory = IPS_GetLogDir(); 
        } 
      if(IPS_SemaphoreEnter(__FUNCTION__.$Directory.$File, 1000)) {

        if(($FileHandle = fopen($Directory.$File, "a")) === false) { 
           SetValue($ID_OutEnabled, false); 
           IPS_SemaphoreLeave(__FUNCTION__.$Directory.$File); 
           return;  //EXIT markiert ein Skript als kaputt
        } 
        fwrite($FileHandle, $Text.c_lf); 
        fclose($FileHandle); 
        IPS_SemaphoreLeave(__FUNCTION__.$Directory.$File); 
     } else {
       //hier würde dein Datensatz einfach im nirvana verschwinden
     }
    }  

paresy

So hatte ich es vorher. Aber leider funktioniert es nicht, da IPS_SemaphoreEnter() im Fall eines Parse errors die besagte Warning schmeißt und mit false returniert:

Parse error:  syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in C:\IP-Symcon\scripts\43660.ips.php on line 5

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 49

Warning:  Cannot detect ThreadID! in C:\IP-Symcon\scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_Output.inc.php on line 49
Abort Processing during Fatal-Error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN)
   Error in Script C:\IP-Symcon\scripts\43660.ips.php on Line 5

Somit gehen die wichtigen Fehler im Logfile verloren. Daraufhin habe das „if“ erstmal rausgenommen. Nun gehen zumindest keine Einträge mehr verloren.

Die Frage ist aber, warum es (auch mit deiner Lösung) zu der Warning kommt und kein Semaphor gesetzt wird.

Gruß

Burkhard

Hast du meinen Code mal probiert?

paresy

Ja, das letzte Ergebnis ist von deiner Version.

Läuft es denn bei dir richtig? Ich bekomme im Fehlerfall (Parse error) keinen Semaphor.

@paresy: kannst du dir das bitte noch einmal ansehen?

Gruß

Burkhard

Ok, lassen wir das „Nebenproblem Semaphore“ erst einmal liegen :slight_smile: und kommen zurück zu meinem ursprünglichen Problem.

Ich habe es inzwischen soweit eingrenzen können, dass ich bereits bei folgendem Skript den Fehler erhalte:

<?
IPSUtils_Include ('IPSCam.inc.php', 'IPSLibrary::app::modules::IPSCam');

SNS_PlayFilesGrouping(11111, array(), array(), 20);
?>

Es kommt der Fehler

Fatal error:  Cannot redeclare class IPSModule in C:\IP-Symcon\scripts\__ipsmodule.inc.php on line 16
Abort Processing during Fatal-Error: Cannot redeclare class IPSModule
   Error in Script C:\IP-Symcon\scripts\__ipsmodule.inc.php on Line 16

Es haben wohl auch andere das Problem.

Eine erneute Suche nach „ipsmodule“ ergibt:

Search "ipsmodule" (2 hits in 2 files)
  T:\scripts\IPSLibrary\app\modules\IPSCam\IPSCam.inc.php (1 hit)
	Line 34: 	IPSUtils_Include ("IPSModule.class.php",              "IPSLibrary::app::core::IPSComponent");
  T:\scripts\IPSLibrary\app\modules\IPSCam\IPSCam_Manager.class.php (1 hit)
	Line 812: 					$module    = IPSModule::CreateObjectByParams($action);

Mir sieht es nun so aus, als ob sich das Kamera Modul nicht mit den neuen IPS Modulen verträgt …

Was ist zu tun?

Gruß

Burkhard

Das Problem wurde durch eine Anpassung in der IPSLibrary gelöst.

Siehe hier.

Gruß

Burkhard