tail -f
Roger
- programmiertechnik
moin!
kann man die ausgabe des befehls
tail -f /pfad/datei
mittels php/javascript/html im browser darstellen, oder gibt es da eine äquivalente funktion? ajax dürfte doch da sicherlich der schlüssel sein?
gruß.
roger.
Hallo,
Ich hör/les nur noch AJAX. AJAX verhindert keine Kriege, AJAX ist kein Allheilmittel, das was mir bei deinem Problem als Schlüssel erscheint ist die regelmässige Auffrischung der Daten beim Client, dabei _kannst_ du AJAX verwenden. Musst aber nicht, gibt genügend andere Techniken (Meta-Refresh, js-Refresh, strg-r, f5, um die zu nennen, die mir gerade einfallen).
gruss
moin!
Hallo,
Ich hör/les nur noch AJAX. AJAX verhindert keine Kriege, AJAX ist kein Allheilmittel, das was mir bei deinem Problem als Schlüssel erscheint ist die regelmässige Auffrischung der Daten beim Client, dabei _kannst_ du AJAX verwenden. Musst aber nicht, gibt genügend andere Techniken (Meta-Refresh, js-Refresh, strg-r, f5, um die zu nennen, die mir gerade einfallen).
ja, logger bleibe.
mir kommts auch hoch, weil das thema steht's durchgekaut wird.
allerdings habe ich immer noch keinen echten lösungsansatz...
gruß.
roger.
moin!
aua: steht's... vielleicht auch mal so: "stets"?
steht's noch?
gruß.
roger.
Moi moin!
kann man die ausgabe des befehls
tail -f /pfad/datei
mittels php/javascript/html im browser darstellen, oder gibt es da eine äquivalente funktion? ajax dürfte doch da sicherlich der schlüssel sein?
"AJAX" ist ein klasse Name für einen Hund und Hunde gehören an die Leine!
Gib bescheid, wenn Du nicht nur Dein "stets"-"steht's"-"stehts"-Problem in den Griff bekommen hast, sondern auch erkannt hast, das man mit PHP _alleine_ gleiche Funktionalität erreichen kann, ohne zusätzliche Programmaufrufe zu veranstallen!
http://de3.php.net/manual/de/ref.filesystem.php
Gruß aus Berlin!
eddi
moin!
verstehe ich nicht. wie ich eine datei mit php öffne weiß ich doch. tail -f gibt aber fortlaufend die daten aus, die währenddessen in die selbige geschrieben werden. das ist ja der knackpunkt, den ich zu lösen versuche.
sicherlich funktionierts mit einem stream. aber wie diesen ausgeben? wenn ich nicht jede sekunde die seite aktualisieren möchte, weil das ist nämlich nervig.
gruß.
roger.
Re:
verstehe ich nicht. wie ich eine datei mit php öffne weiß ich doch. tail -f gibt aber fortlaufend die daten aus, die währenddessen in die selbige geschrieben werden. das ist ja der knackpunkt, den ich zu lösen versuche.
mal darüber nachgedacht, daß selbst wenn Du das Programm tail dafür nutzen wollen würdest, dieses auch nur in einen Stream schreibt?
sicherlich funktionierts mit einem stream. aber wie diesen ausgeben? wenn ich nicht jede sekunde die seite aktualisieren möchte, weil das ist nämlich nervig.
Da kommen wir einer Problembeschreibung doch schon mal um einen Millimeter näher. Ist "es" für einen allgemeinzugängliche Webpräsenz zur Anzeige an alle erdenklichen Browser gedacht, oder als Admintool nur für Dich mit vorhersebaren Browsern und eben deren Funktionalitäten?
Gruß aus Berlin!
eddi
moin!
Da kommen wir einer Problembeschreibung doch schon mal um einen Millimeter näher. Ist "es" für einen allgemeinzugängliche Webpräsenz zur Anzeige an alle erdenklichen Browser gedacht, oder als Admintool nur für Dich mit vorhersebaren Browsern und eben deren Funktionalitäten?
nur für mich. als bastelei.
gruß.
roger.
Re:
<?php
// js.php
header('Content-Type: application/x-javascript');
if($_SERVER['QUERY_STRING']=='') exit;
clearstatcache();
$dat='stream.datei';
if($_SERVER['QUERY_STRING']==filesize($dat)){
for($i=0;$i<30;$i++){
sleep(1);
clearstatcache();
if($_SERVER['QUERY_STRING']!=filesize($dat))
break;
}
if($i==30) exit("anzeige('',".filesize($dat).")");
}
$dat=fopen($dat,'r');
fseek($dat,$_SERVER['QUERY_STRING']);
echo 'anzeige("'.fread($dat,filesize($dat)).'\n",'.filesize($dat).')';
fclose($dat);
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Main Admintool</title>
<script type="application/x-javascript">
// <![CDATA[
function anzeige(a,b){
document.getElementById('anzeige').appendChild(document.createTextNode(a))
var h=document.getElementsByTagName('head')[0]
while(h.getElementsByTagName('script').length>0)
h.removeChild(h.getElementsByTagName('script')[0])
var script=document.createElement('script')
script.src='js.php?'+b
h.appendChild(script)
}
// ]]>
</script>
</head>
<body onload="anzeige()">
<pre id="anzeige"/>
</body>
</html>
Gruß aus Berlin!
eddi
moin!
danke für das script.
ich bin nat. erfolgreich bei dem copy&paste versuch gescheitert. folgende fehlermeldung bekomme ich in der ff js-konsole:
syntax error
js.php?undefined (line 1)
anzeige("\n",)
auf dem schirm steht nur "undefined".
ich habe 2 dateien angelegt. einmal die js.php und einmal eine index.htm, die den unteren teil deines scriptes enthält.
hoffe das war richtig.
zu testzwecken will ich erst einemal eine stinknormale txt datei laden, die sich im selben verzeichnis befindet, wie die beiden erstgenannten.
gruß.
roger.
Re:
<body onload="anzeige('',0)">
Gruß aus Berlin!
eddi
moin!
<body onload="anzeige('',0)">
das undefined ist mittlerweile wech. aber der syntax error ist leider noch da.
\*behoben\*
grund war, dass du den dateihandler genauso genannt hattest, wie die datei selbst ($dat).
ich hab jetzt den handler umbenannt. bekomme aber wiederum eine fehlermeldung:
Fehler: unterminated string literal
Quelldatei: http://server01/js.php?0
Zeile: 1, Spalte: 8
Quelltext:
anzeige("rogertest
\--
"rogertest" ist die erste zeile in meiner test-text-datei.
gruß.
roger.
--
meine freundin sagt, ich wäre neugierig.
so steht's zumindest in ihrem tagebuch.
moin!
ok, scheint wohl an den zeilenumbrüchen zu liegen, die in der datei sind. sobald ich manuell in der datei ein [enter] setze, gibt's die javascript fehlermeldung.
wenn ich aber hinter jedem wort einfach weiter schreibe, dann klappt das wie gewünscht :)
ich versteh nur das script nicht, sonst würde ich gern dran rum wurschteln. die if-abfrage in der js.php, was macht die genau? für was steht der wert 30?
gruß.
roger.
Re:
<?php
// js.php
header('Content-Type: application/x-javascript');
if($_SERVER['QUERY_STRING']=='') exit;
clearstatcache();
$dat='stream.datei';
if($_SERVER['QUERY_STRING']==filesize($dat)){
for($i=0;$i<30;$i++){
sleep(1);
clearstatcache();
if($_SERVER['QUERY_STRING']!=filesize($dat))
break;
}
if($i==30) exit("anzeige('',".filesize($dat).")");
}
$d=fopen($dat,'r');
fseek($d,$_SERVER['QUERY_STRING']);
echo 'anzeige("'.fread($d,filesize($dat)).'\n",'.filesize($dat).')';
fclose($d);
?>
In Worten:
senden eines HTTP-Headers
Prüfung, ob ein QueryString übergeben wurde und gegebenenfalls brich ab
Löschen des Dateiinformationscach
Speichern des Namens der zu überwachenden Datei/Gerät/etc.
Prüfung, ob die Datei größergeworden ist => wenn nein =>
Prüfe jede Sekunde, ob die Datei größer geworden ist, 30 Sekunden lang
wenn größer geworden => brich Prüfung ab
wenn $i==30 (30 Sekunden sind vorüber, ohne Größenveränderung der Datei) =>
brich ab
Auslesevorgang...
Im allgemeinen ist dies ein Böses[TM] Verfahren, weil mittels HTTP ein Quasie-Stream veranstaltet wird, wofür das Protokoll schlichtweg nicht ausgerichtet ist.
Gruß aus Berlin!
eddi
moin!
[...]
Auslesevorgang...
ok, danke. hab's kapiert.
Im allgemeinen ist dies ein Böses[TM] Verfahren, weil mittels HTTP ein Quasie-Stream veranstaltet wird, wofür das Protokoll schlichtweg nicht ausgerichtet ist.
ja, vor allem bei größeren dateien gibt es probleme, da ja imho die datei immer wieder neu eingelesen wird.
für meine ersten schritte aber schonmal ein prima anfang :)
wie würde denn eine verbesserung dessen aussehen (angelehnt an tail -f)?
gruß.
roger.
Re:
ja, vor allem bei größeren dateien gibt es probleme, da ja imho die datei immer wieder neu eingelesen wird.
für meine ersten schritte aber schonmal ein prima anfang :)
Mit anderen Worten, Du hast immer noch nicht begriffen, wie das Script arbeit.
wie würde denn eine verbesserung dessen aussehen (angelehnt an tail -f)?
Bishierhin reicht die Hilfe. Ab jetzt darfst Du Deinen inneren Schweinehund mal überwinnden und eigene Überlegungen anstellen. (Kleiner Tipp: seek())
Gruß aus Berlin!
eddi
moin!
ok, fseek() hatte ich bisher außen vor gelassen. mein fehler. aber ich lerne ja noch :)
es hat mich eben verwundert, wieso aus dem angegebenen logfile beim test nichts ausgegeben wurde, außer die dateigröße (beim direkten aufruf von js.php). wo liegt denn dann der fehler?
gruß.
roger.