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:
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.
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?
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.
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
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
}
}
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.
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