Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 13. Juni 2011 18:20

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Inhalt einer Datei auslesen

Ausgehend von diesem Thema: http://www.cmsmadesimple.de/forum/viewtopic.php?id=643

Schalte doch mal alle Möglichkeiten der Fehermeldungen ein: http://www.cmsmadesimple.de/forum/viewtopic.php?id=946
Vielleicht kann man da im PHP Script etwas abfangen.
Ich vermute, da Du file() verwendest, dass, sollte der Server nicht erreichbar sein, $lines kein Array ist bzw. die Offsets 6 und 16 außerhalb der tatsächlichen Länge des Strings $lines[0] liegen, was zumindest zu einem Notice oder Warning führen müsste.

Du könntest ein timeout setzen, welches kleiner ist, als max_execution_time, damit Du noch genügend Zeit hast, um zu prüfen, was der Server zurückgibt.
Bsp.:

<?php
function smarty_cms_function_get_file_content($params, &$smarty)
{
    @set_time_limit();
    $max_time = @ini_get('max_execution_time');
    $options  = array('http' => array(
            'user_agent'    => $_SERVER['HTTP_USER_AGENT'],
            'max_redirects' => 1,
            'timeout'       => $max_time ? ($max_time-5) : '30',
    ));
    
    $context = @stream_context_create($options);
    $result  = @file_get_contents($params['location'], false, $context);
    $strlen  = @strlen($result);
    
    $offset_start = isset($params['offset_start']) ? $params['offset_start'] : 0;
    $offset_end   = isset($params['offset_end']) ? $params['offset_end'] : $strlen;
    
    if($result && $strlen >= abs($offset_end) && $strlen >= abs($offset_start))
    {
        $result = @substr($result, $offset_start, $offset_end);
    }
    else
    {
        $result = 'Service temporarily not available. Please try again later.';
    }
    
    echo $result;
}
?>

Als function.get_file_content.php im CMSms plugins-Verzeichnis speichern und dann so aufrufen:

{get_file_content location="http://..." offset_start=6 offset_end=16}

Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#2 14. Juni 2011 23:07

blubbb
Gast

Re: Inhalt einer Datei auslesen

Wow, vielen vielen Dank für den Code. Funktioniert so jetzt wunderbar und mein Menü bleibt da! smile

Eine Frage habe ich aber noch: Ich hab grad versucht, den Code auf ne andere Quelle anzuwenden, bei der eine bestimmte Zeile verwendet werden soll und nicht direkt die erste. Hab einiges versucht, aber hab es nicht hinbekommen. Meinst du, du könntest mir noch sagen, wie ich das anstell?

Viele Grüße und nochmals tausend Dank!
Matze

#3 14. Juni 2011 00:17

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Inhalt einer Datei auslesen

Achso, wenn es Dir explizit um die Zeilen geht, dann musst Du anstelle file_get_contents() doch wieder file() verwenden. Hab das Plugin nochmal überarbeitet. Die Daten werden jetzt zwischengespeichert und nur dann vom anderen Server bezogen, wenn sie nicht schon existieren oder wenn sie veraltet sind.

http://dl.dropbox.com/u/2876578/CMSms/P … ontent.php

Doku ist "innenliegend" wink
(Backend: "Erweiterungen->Tags" get_file_content)

Du kannst mit dem Parameter "dateformat" quasi angeben in welchen Abständen die Daten aktualisiert werden.
Gespeichert werden sie unter /uploads/external_data/name der webseite/datum + name der datei.

Dadurch musst Du sie nicht immer vom anderen Server holen, sondern z.B. nur einmal pro Tag/Woche/Monat ...

Mit dem Parameter "line" kannst Du eine beliebige Zeile angeben, die ausgelesen werden soll.
Ansonsten wie gehabt.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#4 14. Juni 2011 14:03

blubbb
Gast

Re: Inhalt einer Datei auslesen

Wow, nochmals vielen Dank.
Ich hab das jetzt soweit alles eingestellt und auch kapiert, wie das mit dem dateformat geht, aber jetzt hab ich noch ein Problem:
Ich will von einer Quelle zwei verschiedene Lines auslesen, hab also praktisch hintereinander folgende Befehle:

{get_file_content location="http://www.vorarlberg.at/seewasserstand/" offset_start=17 offset_end=20 line=140 dateformat=YndH}
{get_file_content location="http://www.vorarlberg.at/seewasserstand/" offset_start=17 offset_end=18 line=139 dateformat=YndH}

Problem ist jetzt eben, dass ich bei einem der Werte immer den Fehler krieg, dass die Daten derzeit nicht verfügbar seien. Das liegt wohl da dran, dass beides in die gleiche Cache-Datei gelegt wird, wenn ich das richtig sehe. Ändere ich das dateformat auf YndHis, hole also jede Sekunde die Daten, dann geht es einmal, einmal nicht. Je nachdem, ob die beiden Abfragen in der gleichen Sekunde ablaufen, also je nachdem, ob zwei Cache-Dateien erstellt werden oder nicht.

In der Praxis sieht es bei mir so aus, dass ich von mir aus jede Stunde den aktuellen Pegel holen will (eine Zeile, der erste Befehl oben) und gleichzeitig das Datum des Pegels (die zweite Zeile, zweiter Befehl oben).

Vielleicht kannst du mir noch erklären, wie ich das hinkrieg? Ich weiß, ich nerve, aber ich saß jetzt den ganzen Morgen dran und hab's nicht zum Laufen bekommen. sad

Ansonsten, wie gesagt, nochmal vielen Dank. Es funzt echt super, nur sobald ich eben zwei Sachen von einer Quelle holen will, geht's nicht mehr.

Viele Grüße
Matthias

#5 14. Juni 2011 14:20

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Inhalt einer Datei auslesen

Habe das Plugin heute nochmal aktualisiert. War ein kleiner Fehler drin.
Einfach nochmal neu herunterladen.
Man kann jetzt auch mehrere Zeilen aufeinmal auslesen.
Man kann außerdem die offsets auf den gesamten Inhalt oder auf jede Zeile einzeln anwenden.
Außerdem kann man sich die Zeilen auch als Array zurückgeben lassen. Dann kann man sie später separat verwenden.
Was momentan leider noch nicht geht - und mir auch irgendwie zu kompliziert ist - dass man für jede Zeile ein anderes Offset angeben kann.
Habe Dein Beispiel gerade mal getestet.
Bei mir funktioniert es.
Ergebnis: 327 14.06.2011 10.00

(Eventuell mal das Verzeichnis /uploads/external_data/ löschen)

€: kleines Update. Hab den Parameter cache_dir hinzugefügt. Damit kann man angeben, wo die Daten zwischengespeichert werden sollen. (Standard ist /tmp/cache/external_data)

Beitrag geändert von NaN (14. Juni 2011 14:54)


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#6 14. Juni 2011 15:18

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Inhalt einer Datei auslesen

Um das ganze etwas performanter zu gestalten, könnte man bei Deinem Beispiel - da beide Zeilen an derselben Stelle beginnen - auch beide Zeilen aufeinmal auslesen, sich als Array zurückgeben lassen, und anstelle mit offset_end im Template mit dem Smarty-Modifikator truncate arbeiten:

{get_file_content location="http://www.vorarlberg.at/seewasserstand/" line="139-140" offset_start="17" dateformat="YndH" assign="my_lines" assign_as="array" offset_per_line=true}
Zeile 139: {$my_lines[0]|truncate:"18":''}<br />
Zeile 140: {$my_lines[1]|truncate:"20":''}<br />

Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#7 14. Juni 2011 15:32

blubbb
Gast

Re: Inhalt einer Datei auslesen

Also, es geht jetzt, nachdem ich die neueste Version von deinem Plugin gezogen habe, echt super wieviel Arbeit du dir machst, danke! smile

Was mir gerade noch aufgefallen ist: In meinem Fall ist eine meiner Quellen momentan nicht erreichbar, sprich es kommt eine Zeitüberschreitung beim Aufruf dieser. In der ersten Version deines Plugins wurde dann der Fehler ausgegeben mit Service nicht erreichbar. Jetzt bleibt die Ausgabe praktisch einfach leer, wenn die Quelle nicht erreichbar ist. Hast du das rausgemacht oder ist es durch das Update verschwunden?

Viele Grüße
Matthias

#8 14. Juni 2011 15:36

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Inhalt einer Datei auslesen

Das ist im Quelltext noch drin.
Hab es auskommentiert, weil ich mir dachte, dass jeder vielleicht eine andere Meldung haben will.
Du kannst ja mit assign das Ergebnis einer Variablen zuweisen und prüfen, ob diese einen Wert beinhaltet.
Wenn nicht, kannst Du selber entscheiden was stattdessen ausgegeben werden soll. Evetuell noch mit einem Link zur eigentlichen Quelle (falls das Problem eventuell doch mal am eigenen Server liegen sollte).
Ansonsten musst Du im Quelltext nur das Kommentarzeichen von Zeile 98 in Zeile 99 versetzen.

PS: noch ein kleines Update. Hatte mit den Arrays Probleme.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#9 14. Juni 2011 15:41

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Inhalt einer Datei auslesen

Noch ein Tipp: Wenn man die Zeilen in umgekehrter Reihenfolge haben will, muss man nur die Zeilenangaben vertauschen: line="100-0".
Dann dreht das Plugin die Zeilenreihenfolge um und zählt von hinten.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#10 14. Juni 2011 15:46

blubbb
Gast

Re: Inhalt einer Datei auslesen

Hab's gefunden, danke. Und läuft jetzt auch alles wie es soll! Toll! smile