Ankündigung

Einklappen
Keine Ankündigung bisher.

Baustein 19000690 Problem mit CentOS 7

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Baustein 19000690 Problem mit CentOS 7

    mars Baustein 19000690
    Kannst du mal schauen wo das Problem mit PHP 7 liegt?

    Grüße André
    ...and I thought my jokes were bad!

    #2
    Bei mir läuft noch alles mit CentOS6.5 und dem zugehörigen PHP 5.x (?) sehr stabil. Bisher habe ich keine Notwendigkeit für ein Update resp. Neuinstallation.
    Meine PHP-Kentnisse sind nicht so gut, dass ich Unterschiede in den Versionen erkenne.

    Leider habe ich Monemtan keine Zeit, mich da einzuarbeiten. Also ist der LBS erst einmal ohne Support für CentOS 7 von mir.

    Sorry und Gruß
    Marco

    Kommentar


      #3
      mars
      Ok, danke für die Info.

      hier angepasst der Code für CentOS7, falls Bedarf besteht.
      Code:
      ###[DEF]###
      [name = Jahrestage v0.6]
      
      [e#1 = Trigger #init=1]
      [e#2 = LogLevel #init=0]
      [e#3 = Datei(URL) ]
      [e#4 = Trennzeichen #init=:]
      [e#5 = Listenlänge #init=0]
      
      [a#1 = Ereignis] (Name / Bezeichnung des Ereignisses)
      [a#2 = Datum1] (Datum des Ereignisses als 'TT.MM.JJJJ')
      [a#3 = Datum2] (Datum des Ereignisses als Unix-Timestamp)
      [a#4 = Anz. Tage] (bis zum nächsten Jahrestag)
      [a#5 = Jahrestag1] (Datum des nächsten Jahrestages als 'TT.MM.JJJJ')
      [a#6 = Jahrestag2] (Datum des nächsten Jahrestages als Unix-Timestamp)
      [a#7 = Anz. Jahre] (wievielter Jahrestag)
      
      [v#1 = v0.6] (LBS-Version)
      ###[/DEF]###
      
      
      ###[HELP]###
      
      Dieser EDOMI-Logikbaustein (LBS) ermittelt aus einer Textdatei mit Ereignisbezeichnungen und zugehörigen Datumsangaben (Aufbau siehe unten) eine Liste mit Jahrestagen. Die Ausgabe erfolgt dabei so geordnet, dass die Daten des nächsten anstehenden Jahrestagen als jeweils erstes Listenenelemt ausgegeben wird.
      (Ich verwende dies, um mir die nächsten Geburtstage der Verwandschaft in der Visu anzuzeigen.)
      
      Die Textdatei mit den Jahrestagen wird über den Eingang E3 (URL) angegeben. Wenn die Datei auf dem Edomi-Server liegt (z.B. /usr/local/edomi/www/jahrestage.txt), ist die URL der folgende Pfad: http://<EDOMI-IP>/jahrestage.txt
      
      Die Textdatei muss für jedes Ereignis genau eine Zeile der Form '<Bezeichnung_des_Ereignisses><Trennzeichen><Datum _im_Format_TT.MM.JJJJ>' enthalten. Also Tag und Monat immer 2stellig und das Jahr 4stellig mit Punkt als Trennzeichen. Das Datum muss gültig sein (MM == 13 oder 30.02.1999 geht nicht ;-).
      Ab v0.5 kann das Datum auch in der Form TT.MM. (also ohne Jahr) angegeben werden. Die korrespondierenden Angaben an A3 und A7 bleiben dann leer.
      HINWEIS: Es sind nur positive Jahresangaben (also alles n. Chr.) zulässig, da negative Jahreszahlen intern zur Behandlung fehlender Jahresangaben genutzt werden.
      
      ab Version 0.2:
      Jede Zeile, die mit # beginnt (Raute als erstes Zeichen) wird als Kommentarzeile interpretiert und nicht ausgewertet.
      
      
      
      Beispieldatei (Trennzeichen ist der Doppelpunkt)
      Konrad Zuse (geb.): 22.06.1910
      Mondlandung: 21.07.1969
      Gründung KNX Association: 20.10.1990
      EDOMI-Launch: 27.12.2015
      
      
      E1: = !=0 = Trigger (Es empfiehlt sich ein Edomi System-KO, z.B. Trigger: Täglich 00:00:00).
      E2: = debug (1=true, 0=false / Bei true wird detailliert in das Individual-Log geschrieben.)
      E3: = url (Pfad zum Textfile mit den Ereignissen)
      E4: = Trennzeichen (, dass in der Datei zur Trennung von Bezeichnung und Datum verwendet wird.)
      E5: = Anzahl der auszugebenden Jahrestage / Länge der Listen an den Ausgängen (0=alle)
      
      A1: = Liste mit den Bezeichnungen der Ereignisse (wie in der Datei _vor_ dem Trennzeichen angegeben)
      A2: = Liste mit den Daten der Ereignisse als TT.MM.JJJJ (wie in der Datei _hinter_ dem Trennzeichen angegeben)
      A3: = Liste wie A3, jedoch als UNIX-Timestamp
      A4: = Liste mit Anzahl der Tage (vom aktuellen System-Datum) bis zum nächsten Jahrestag
      A5: = Liste mit den Daten der nächsten Jahrestage als TT.MM.JJJ
      A6: = Liste wie A6, jedoch als UNIX-Timestamp
      A7: = Liste mit Anzahl der 'wievielten' Jahrestage
      
      Hinweise:
      - als Listentrenner an den Ausgängen dient das Zeichen '|' (ohne Anführungszeichen, also der senkrechte Strich)
      - Daten ist die Mehrzahl von Datum ;-)
      
      
      Beispiel:
      Mit o.g. Beispieldatei liefert der LBS am 28.10.2016 folgende Werte an den Ausgängen:
      A1 = EDOMI-Launch|Konrad Zuse (geb.)|Mondlandung|Gründung KNX Association
      A2 = 27.12.2015|22.06.1910|21.07.1969|20.10.1990
      A3 = 1451170800|-1878596372|-14173200|656377200
      A4 = 60|237|266|357
      A5 = 27.12.2016|22.06.2017|21.07.2017|20.10.2017
      A6 = 1482793200|1498082400|1500588000|1508450400
      A7 = 1|107|48|27
      
      
      Changelog:
      v0.1 - initial Version
      v0.2 - Kommentarzeilen möglich (mittels vorangestelltem #)
      v0.3 - div. Gültigkeitsprüfungen ergänzt und Logging angepasst
      v0.4 - BOM gefixt, thx @starwarsfan
      v0.5 - Datumsangaben ohne Jahr zulässig
      v0.5a - Bugfix u.a. bzgl. Kommentarzeilen
      
      ###[/HELP]###
      
      ###[LBS]###
      <?
      function LB_LBSID($id) {
      $Version = logic_getVar($id,1); // LBS-Version
      $LogFileName = 'LBS19000690_Jahrestage-'.$id; // Dateiname fürs Logging
      if ($E=logic_getInputs($id)) {
      if ($E[1]['refresh']==1 && trim($E[3]['value'])!='') {
      if ($E[2]['value']==1) { writeToCustomLog($LogFileName,'-','LBS '.$Version.', EXEC-Teil startet mit E2 == 1 (Debug)'); }
      logic_callExec(LBSID,$id);
      }}}
      ?>
      ###[/LBS]###
      
      ###[EXEC]###
      <?
      require(dirname(__FILE__).'/../../../../main/include/php/incl_lbsexec.php');
      sql_connect();
      //-------------------------------------------------------------------------------------
      
      $Debug = 0; // von E2
      $TxtDatei = ''; // von E3
      $Trenner = ':'; // von E4
      $ListLen = 0; // von E5
      
      $ErgName = ''; // Variable zur Ausgabe an A1 (Bezeichnung / Name des Ereignisses)
      $ErgDatum = ''; // Variable zur Ausgabe an A2 (Datum des Ereignisses als 'TT.MM.JJJJ')
      $ErgDatum2 = ''; // Variable zur Ausgabe an A3 (Datum des Ereignisses als Unix-Timestamp)
      $AnzTage = ''; // Variable zur Ausgabe an A4 (Tage bis zum nächsten Jubiläum)
      $JTgDatum = ''; // Variable zur Ausgabe an A5 (Datum des nächstes Jahrestages als 'TT.MM.JJJJ')
      $JTgDatum2 = ''; // Variable zur Ausgabe an A6 (Datum des nächstes Jahrestages als Unix-Timestamp)
      $AnzJahre = ''; // Variable zur Ausgabe an A7 (wievielter Jahrestag)
      
      $LogFileName = 'LBS19000690_Jahrestage-'.$id; // Dateiname fürs Logging
      
      // LBS-Eingänge lesen und ggf. loggen
      if ($E=logic_getInputs($id)) {
      $Debug = !($E[2]['value'] == 0) ;
      $TxtDatei = $E[3]['value'];
      $Trenner = $E[4]['value'];
      $ListLen = $E[5]['value'];
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','E3(URL) ist '.$TxtDatei);
      writeToCustomLog($LogFileName,'-','E4(Trennzeichen) ist '.$Trenner);
      writeToCustomLog($LogFileName,'-','E4(Anzahl) ist '.$ListLen);
      }
      }
      
      // Prüfen, ob die Datei gefunden wird. Ggf. wird der LBS (nach Eintrag ins LogFile) abgebrochen.
      $file_headers = @get_headers($TxtDatei);
      if (stripos($file_headers[0],'404 Not Found') >0 || (stripos($file_headers[0], '302 Found') > 0 && stripos($file_headers[7],'404 Not Found') > 0)) {
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','Datei/URL nicht gefunden!');
      }
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','LBS Jahrestage ABGEBROCHEN');
      writeToCustomLog($LogFileName,'-',' ------------------------ ');
      writeToCustomLog($LogFileName,'-',' ');
      }
      logic_setState($id,0);
      sql_disconnect();
      exit();
      }
      
      // Zeitzohne setzen
      setlocale (LC_TIME, 'de_DE');
      
      // zeilenweise die $TxtZeilen aus der $TxtDatei einlesen
      $i = 0;
      $TxtZeilen = file($TxtDatei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','Datei ist eingelesen, wird verarbeitet ...');
      }
      
      // jede eingelesene Textzeile (aus der Datei) ...
      foreach ($TxtZeilen as $Index => $Zeile) {
      $Zeile = trim($Zeile," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen
      $ZeileOK = TRUE; // (vorläufiges) Kennzeichen, dass die Datenzeile OK ist
      
      // ggf. Eintragungen ins Logfile
      if ($Debug) {
      writeToCustomLog($LogFileName,'-',$Zeile);
      }
      
      // diverse Gültigkeitsprüfungen
      // prüfen, ob die Zeile eine Kommentarzeile ist
      if ($Zeile[0] == '#') {
      $ZeileOK = FALSE;
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','... Kommentar, Zeile wird ignoriert!');
      }
      continue; // Abbruch (und weiter mit nächster Zeile)
      }
      else {
      $Werte = explode($Trenner[0], $Zeile); // Zeile aus der Textdatei am Trennzeichen in (zwei) Werte teilen
      }
      
      // prüfen, ob genau ein Trennzeichen, d.h. genau ein Wertepaar in der Zeile vorhanden ist
      if ($ZeileOK &&(count($Werte) != 2)) {
      $ZeileOK = FALSE;
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','... kein oder mehrere Trennzeichen, Zeile wird ignoriert!');
      }
      continue; // Abbruch (und weiter mit nächster Zeile)
      }
      else {
      $Werte[0] = trim($Werte[0]," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen
      $Werte[1] = trim($Werte[1]," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen
      $Jahrestage[$i]['Name'] = $Werte[0]; // ... Feld 'Name' befüllen mit dem ersten Wert (also alles vor dem Trennzeichen)
      }
      
      // prüfen, ob das Datumsformat gültig (also TT.MM.JJJJ oder TT.MM.) ist
      if ($ZeileOK && (!(preg_match('/^\d\d\.\d\d\.\d\d\d\d$/', $Werte[1])||(preg_match('/^\d\d\.\d\d\.$/', $Werte[1]))))) {
      $ZeileOK = FALSE;
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','... ungültiges Datumsformat, Zeile wird ignoriert!');
      }
      continue; // Abbruch (und weiter mit nächster Zeile)
      }
      
      // prüfen, ob das Datum gültig (also z.B. nicht 30.02.xxxx oder xx.13.xxxx etc.)
      if ($ZeileOK) {
      $TempDatum = explode('.', $Werte[1]);
      if (preg_match('/^\d\d\.\d\d\.$/', $Werte[1])) { // Datumsangabe ohne Jahr
      $DatumOK = checkdate($TempDatum[1], $TempDatum[0], 2000); // Jahr 2000 ist Schaltjahr, somit ist 29.02.xxxx gültig
      $TempDatum[2] = -9999; // Jahr 9999 v.Chr. als Kennzeichen für "kein Jahr angegeben"
      }
      else { // Datumsangaben komplett
      $DatumOK = checkdate($TempDatum[1], $TempDatum[0], $TempDatum[2]);
      }
      if (!($DatumOK)) {
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','... Datum ('.$Werte[1].') ist ungültig, Zeile wird ignoriert!');
      }
      $ZeileOK = FALSE;
      continue; // Abbruch (und weiter mit nächster Zeile)
      }
      $Jahrestage[$i]['Tag'] = intval($TempDatum[0]);
      $Jahrestage[$i]['Monat'] = intval($TempDatum[1]);
      $Jahrestage[$i]['Jahr'] = intval($TempDatum[2]);
      
      // writeToCustomLog($LogFileName,'-','TT= '.intval($TempDatum[0]).' / MM= '.intval($TempDatum[1]).' / JJJJ= '.intval($TempDatum[2]));
      }
      // div. Gültigkeitsprüfungen abgeschlossen
      
      // Weiterverarbeitung für gültige Daten
      if ($ZeileOK) { // Gültigkeitsprüfung für die Zeile bestanden, dann ...
      $Datum = mktime(0, 0, 0, $Jahrestage[$i]['Monat'], $Jahrestage[$i]['Tag'], $Jahrestage[$i]['Jahr']);
      $Jahrestage[$i]['Datum'] = $Datum;
      
      // aktuelles 'Alter' des Jahrestages ermitteln und Feld 'Alter' befüllen
      $Jahrestage[$i]['Alter'] = date('Y') - date('Y', mktime(0, 0, 0, date('m'), date('d'), date('Y', $Datum)));
      
      // Ermitteln, wann der nächste Jahrestag (also die nächste Party ;-) anliegt,
      // dazu Timestamp für Tag und Monat aus Textdatei und aktuelles Jahr ...
      $Feiertag = mktime(0, 0, 0, date('m', $Datum), date('d', $Datum), date('Y', time()));
      $Jahrestage[$i]['Party'] = $Feiertag; // ... ins Feld 'Party'
      
      // dann noch prüfen, ob die diesjährige Party schon vorbei ist
      // dazu prüfen, ob der diesjährige Feiertag bereits vergangen ist
      if ($Feiertag < mktime(0, 0, 0, date('m', time()), date('d', time()), date('Y', time()))){
      // dann ist die nächste Party erst im kommenden Jahr (date('Y', time())+1)
      $Jahrestage[$i]['Party'] = mktime(0, 0, 0, date('m', $Datum), date('d', $Datum), date('Y', time())+1);
      // und das 'Alter' ist schon ein Jahr mehr
      $Jahrestage[$i]['Alter'] = $Jahrestage[$i]['Alter'] +1;
      }
      
      // ermitteln, wie lange (wie viele Tage) es noch bis zur nächsten Party dauert
      $Dauer = ($Jahrestage[$i]['Party'] - mktime(0, 0, 0, date('m',time()), date('d',time()), date('Y',time())));
      $Jahrestage[$i]['Tage'] = floor($Dauer / 86400);
      
      $i++; // Index-Zähler (zur Bearbeitung der nächsten Zeile) erhöhen ...
      } // div. Berechnungen bzgl. Datumsangaben abgeschlossen
      } // ... und weiter mit der nächsten Zeile aus der Datei
      
      
      // hier sind nun alle gültigen Zeilen der Datei durch und für jede Zeile sind 'Name', 'Datum', 'Alter', 'Party' und 'Tage' im array $Jahrestage
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','Daten sind berechnet, Sortierung folgt ...');
      }
      
      // nun die $Jahrestage nach 'Tage' sortieren, mit dem kleinsten Wert für 'Tage beginnend, also der nächste zuerst
      usort($Jahrestage,'cmp'); // Jahrestage sortieren (siehe http://php.net/manual/de/function.usort.php)
      
      // Ausgabe der Ergebnisse
      $AnzJahrestage = count($Jahrestage); // Anzahl der Jahrestage feststellen
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','Daten sind sortiert, LBS-Ausgänge werden gesetzt ...');
      }
      
      if ($ListLen == 0) { // wenn Listenlänge (also Wert von E4) == 0, dann ...
      $ListLen = $AnzJahrestage; // ... Ausgabe begrenzen auf Anzahl der Jahrestage
      }
      
      $i = 0; // Zähler für ausgegeben Anzahl, um ggf. vor Erreichen des Endes abzubrechen
      // String für Ausgaben zusammensetzen, ...
      for ($f=0; ($f<$AnzJahrestage && $i<$ListLen); $f++){
      $ErgName = $ErgName . $Jahrestage[$f]['Name'] . '|';
      $JTgDatum = $JTgDatum . date('d.m.Y',$Jahrestage[$f]['Party']) . '|';
      $JTgDatum2 = $JTgDatum2 . $Jahrestage[$f]['Party'] . '|';
      $AnzTage = $AnzTage . $Jahrestage[$f]['Tage'] . '|';
      // ... dabei berücksichtigen, ob im Datenfile das Jahr angegeben war
      if ($Jahrestage[$i]['Jahr'] > 0) {
      $ErgDatum = $ErgDatum . date('d.m.Y',$Jahrestage[$f]['Datum']) . '|';
      $ErgDatum2 = $ErgDatum2 . $Jahrestage[$f]['Datum'] . '|';
      $AnzJahre = $AnzJahre . $Jahrestage[$f]['Alter'] . '|';
      } else {
      $ErgDatum = $ErgDatum . date('d.m.',$Jahrestage[$f]['Datum']) . '|';
      $ErgDatum2 = $ErgDatum2 . '|';
      $AnzJahre = $AnzJahre . '|';
      }
      $i++;
      }
      
      // Bereinigen (letztes Zeichen, also das '|' am Ende löschen)
      $ErgName = substr($ErgName, 0, -1);
      $ErgDatum = substr($ErgDatum, 0, -1);
      $ErgDatum2 = substr($ErgDatum2, 0, -1);
      $AnzJahre = substr($AnzJahre, 0, -1);
      $JTgDatum = substr($JTgDatum, 0, -1);
      $JTgDatum2 = substr($JTgDatum2, 0, -1);
      $AnzTage = substr($AnzTage, 0, -1);
      
      // LBS-Ausgänge setzten
      logic_setOutput($id, 1, $ErgName); //$ErgName an A1
      logic_setOutput($id, 2, $ErgDatum); //$ErgDatum an A2
      logic_setOutput($id, 3, $ErgDatum2); //$ErgDatum2 an A3
      logic_setOutput($id, 4, $AnzTage); //$AnzTage an A4
      logic_setOutput($id, 5, $JTgDatum); //$JTgDatum an A5
      logic_setOutput($id, 6, $JTgDatum2); //$JTgDatum2 an A6
      logic_setOutput($id, 7, $AnzJahre); //$AnzJahre an A7
      
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','Ausgänge mit '.$ListLen.' Datensätzen beschrieben ...');
      }
      
      
      logic_setState($id,0);
      //-------------------------------------------------------------------------------------
      sql_disconnect();
      
      if ($Debug) {
      writeToCustomLog($LogFileName,'-','... LBS normal beendet');
      writeToCustomLog($LogFileName,'-',' ');
      }
      
      // Sortierfunktion von hier: http://php.net/manual/de/function.usort.php
      function cmp($a, $b) {
      if ($a['Tage'] == $b['Tage'])
      {
      return 0;
      }
      return ($a['Tage'] < $b['Tage']) ? -1 : 1;
      }
      
      ?>
      ###[/EXEC]###
      ...and I thought my jokes were bad!

      Kommentar

      Lädt...
      X