Hi Tom,
ich habe gerade mal die Scripte überflogen und mir ein paar Gedanken dabei gemacht.
Im Prinzip könnte man die Lesbarkeit des Quelltextes noch verbessern ;-)
Hm, kann man natürlich machen, wobei...
...und eine etwas bessere Aufteilung in Funktionen ist empfehlenswert.
...mir das so in Functionen unterteilt eher schwer fällt zu vestehen (wenn das Script unbekannt ist), als wenn es in einem durch geht.
Btw hatte ich diese Kommentare ja nur noch schnell für dich zum schnelleren Verstehen eingefügt.
Das soll man zwar auch nicht übertragen, weil jedes Load einer Funktion auch teuer ist, aber die Fehlerbehandlung wird dadurch vereinfacht und übersichtlicher. Bei fehler wird einfach der Funktionsblock beendet mit Fehlernummer; sonst benötigt man meistens komplizierte Bedingungs-Verschachtelungen.
Sicherlich, das hat auch seine Vorteile.
Und ein Denkfehler ist mir noch aufgefallen, der auch unbedingt in das wachsende Artikel-Konzept rein muss:
Thema File-Locking:
if($fp)
{
for($x=0;$x<5;$x++)
{
if(flock($fp,LOCK_SH)) break;
usleep(8000);
// Hier hatte ich doch schon mal angemerkt, dass laut http://www.selfphp.de/funktionsreferenz/sonstige_funktionen/usleep.php#beschreibung
// diese Funkction unter Windows nicht läuft.
// Warum also nicht sleep() nehmen, was funktionieren soll?
}
...
}
Die Locking-Funktion hat eine eigene eingebaute Idle-Funktion. Wenn man flock() aufruft, bleibt die Kontrolle solange in der Funktion, bis der Lockversuch Erfolg hatte, oder die maximale Script-Laufzeit erreicht ist.
Idle? Und du meinst jetzt, das oben ist falsch, da dort bei fehlerhaftem Locking einfach fortgefahren wird? Ja, stimmt.
Wenn man nun den User nicht solange warten lassen will (das sind dann bei Default 30 Sekunden), baut man eben eine eigene Schleifenkonstruktion um den Lockverssuch gherum, so wie Du das getan hast. Allerdings muss man der Funktion dann sagen, dass sie nicht mehr automatisch solange warten soll, bis es passt...
if($fp)
{
$lock = false; # Kontrollschalter, ob Locking klappt
for($x=0;$x<5;$x++)
{
$lock = (flock($fp,LOCK_SH + LOCK_NB));
if ($lock) break;
usleep(8000);
}if ($lock)
{
# ...
}
else
{
# Fehlerbehandlung
}fclose($fp);
}
Durch das Addieren des NonBlock-Bits weiß die Funktion nun, dass sie nicht warten soll, sondern false zurückgeben soll, wenn das Handle mit LOCK_EX belegt ist. Theoretisch ist es zu diesem Moment auch möglich, dass die Datei gar nicht mehr da ist. Das bedeutet, dass man alle Operationen mit dem Handle also trotzdem unter Fehlerbehandlung stellen muss.
Achso, das meintest du mit Denkfehler. Stimmt, da wäre es natürlich blöd, wenn er 30 Sekunden warten um von alleine neu versuchen zu locken.
Ist halt besser, wenn man alles von Hand macht und weniger auf automatik setzt ;-)
Außerdem sit es wenig sinnvoll, normal weiter zu arbeiten, wenn das Locking nicht geklappt hat. Also muss man sich den Erfolg merken und nochmals abprüfen.
s.o.
Soviel zum Thema Locking und Fehlerbehandlung.
Ich bitte höflichst um Korrektur durch unsere Regulars... ;-)
Korrektur durch unsere Regulars? Du meinst ich soll das Script jetzt mal ausbessern und dir erneut zuschicken? OK, ich hab grad etwas Zeit, kann das also Problemlos machen.
Btw: Bist du schon mit deiner Blättern Funktion bei der Ausgabe weitergekommen? Zusätzlich müsste man noch die Archvierungsfunktion einbauen. Ich würde sagen, soviele News hat man nicht. Man dürfte an die 2000 News in eine Datei kriegen, somit würde eine Datei pro Jahr reichen. Also müsste man schauen, alle News deren UNIX Stempel 30 x 24 x 60 x 60 Sekunden kleiner ist als der aktuelle (30 Tage) werden in eine Textdatei geschrieben, welche date("y",$timestamp).".txt" heißt, also z.B. 2004.txt (oder .dat o.ä.). Mach ich dann jetzt mal.
Deine Kommentare in meine Script:
---------------------------------
Die Zeit würde ich einmal bestimmen und mir merken
damit sie überall gleich ist und man auch feststellen kann
welches der letzte veränderte Datensatz ist
Das macht sicherlich Sinn, am Anfang $time = time(); zu sagen und dann immer die Zeit zu verwenden.
In der Datei haben Tags eigentlich nichts zu suchen.
Zum Speichern in Textdateien würde ich das
"\r\n", "\r", "\n" gegen ein chr(127) ersetzen (hier nicht notwendig)
und erst bei der Anzeige der Daten wieder zurückübersetzen in "\r\n",
anschließend die entities mit htmlentities() umwandeln, und dann nl2br() nutzen,
falls die Darstellung im HTML-Text steht oder auch nicht, wenn
die Darstellung in der Textarea stattfinden soll.
Also folgendes machen:
str_replace("\r\n",chr(127));
str_replace("\r",chr(127));
str_replace("\n",chr(127));
Bei der Ausgabe:
str_replace(chr(127),"\r\n");
htmlentities($string,ENT_QUOTES);
Und um in HTML darzustellen noch ein
nl2br();
hinterher.
--------------------
So, dann setze ich mich jetzt mal dran, und bastle da weiter dran rum.
Der Rest war doch OK im Script, oder? Und in den anderen Scripten?
MfG, Dennis.