CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
28.02.2006, 02:30:16
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Heppi
Ich rufe test1.php auf, welche eine Datei öffnet, sperrt, einen Timestamp schreibt, 20 Sekunden wartet,
|
Der Fehler tritt nicht in 20 sec. auf sondern zB. dann:
Bei User1 ist die Zeile fopen dran. File ist noch nicht geLOCKt.
Justament schaltet der Apache auf User2 um, der das selbe Script requestet...
Und das sind diese kleinen Gemeinheiten, die passieren, wenn mehr als ein User ein File beschreiben darf.
Bei einer SQL Datenbank passiert sowas nicht. Da isses egal, ob der Gästebucheintrag des Users1 erst nach dem Gästebucheintrag des Users2 steht.
Bei fopen muß man das beachten:
"Wenn die Datei nicht existiert, wird versucht sie anzulegen."
Das 'nicht existiert' kriegt PHP aber nicht gebacken. PHP versucht die Datei zu öffnen. Kommt da eine Fehlermeldung/Warnung, denkt PHP, die Datei gibts nicht und es müsse eine neue Datei angelegt werden. User2 kennt daher den alten Datenbestand nicht. User1 hat mittlerweile seinen Kram geschrieben und User2 überschreibt alles mit dem, was es weiß: nix und ich bin der Erste.
So setzt man unter Streß jeden Counter auf 1, jedes Gästebuch auf den letzten Eintrag und <wat man sonst noch so treibt>.
Filebasierte Anwendungen, bei denen mehr als ein User schreiben darf, sind extrem kritisch und gehören zu dem Unangenehmsten, was man sich vorstellen kann. Also: "Finger weg!"
Geändert von meikel (†) (28.02.2006 um 02:31:38 Uhr)
|
28.02.2006, 08:40:19
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Ich seh's zwar immer noch nicht ein, daß das so oft passieren soll, aber ich begreif zumindest was ihr meint.
Ein Problem sehe ich darin, daß ich mein Log-File folgendermaßen öffne:
PHP-Code:
$log_inhalt = implode('', file($log_file));
Hier wird nicht geprüft ob das File gesperrt ist.
Einen anderen Lösungsansatz würde ich darin sehen (wenn das obige Problem behoben ist), die Datei mit "r+" oder "a+" zu öffnen, sie dann zu sperren und anschließend auf eine Länge von 0 setzen. Meine Frage: wie setze ich die Länge auf 0? Der Parameter "w" macht dies ja ebenfalls, also muß es dafür doch auch was geben. Ich kann's allerdings nicht finden.
|
28.02.2006, 08:42:49
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Nochmal kurz ich.
Ist die Zeile eigentlich nicht 'illegal'?
PHP-Code:
$log_inhalt = implode('', file($log_file));
Ich greife mit file() doch auf eine Datei zu ohne diese vorher geöffnet zu haben, oder!?
|
28.02.2006, 09:43:04
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Vorschlag:
PHP-Code:
// Name des Log-File
if($date[mon] < 10)
$log_file = "dat/log".$date[year].'0'.$date[mon].".dat";
else
$log_file = "dat/log".$date[year].$date[mon].".dat";
// Log-File auslesen, wenn vorhanden
if(file_exists($log_file)){
$log_datei = fopen($log_file, 'r+');
flock($log_datei, LOCK_EX);
$log_inhalt = "\n".file_get_contents($log_file);
ftruncate($log_datei, 0);
$log_inhalt = "...|||||$log_inhalt";
flock($log_datei, LOCK_UN);
fclose($log_datei);
}
else{
$log_datei = fopen($log_file, 'w');
flock($log_datei, LOCK_EX);
$log_inhalt = "...";
}
fputs($log_datei, $log_inhalt);
flock($log_datei, LOCK_UN);
fclose($log_datei);
Geändert von Heppi (28.02.2006 um 10:52:49 Uhr)
|
01.03.2006, 08:49:30
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Sind jetzt alle sprachlos? ;-)
|
01.03.2006, 09:50:59
|
Junior Member
|
|
Registriert seit: Apr 2005
Beiträge: 309
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Heppi
Ich greife mit file() doch auf eine Datei zu ohne diese vorher geöffnet zu haben, oder!?
|
Wo ist das Problem? So funktioniert File doch nunmal. Denk drüber nach, dann kannst Du Dir selber eine Funktion namens "File" schreiben, die genau das selbe macht : Sie öffnet eine Datei, ließt Zeile für Zeile in ein Array, schließt die Datei und übergibt die das Array...
Was wolltest Du jetzt mit dem Script sagen?
|
01.03.2006, 10:52:36
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Giz
Wo ist das Problem? So funktioniert File doch nunmal. Denk drüber nach, dann kannst Du Dir selber eine Funktion namens "File" schreiben, die genau das selbe macht : Sie öffnet eine Datei, ließt Zeile für Zeile in ein Array, schließt die Datei und übergibt die das Array...
|
Naja, hier wird aber nicht geprüft ob das File gesperrt ist oder nicht.
Zitat:
Zitat von Giz
Was wolltest Du jetzt mit dem Script sagen?
|
Hier würde sich doch ausschließen, daß ein File geöffnet wird, wenn jemand anderes gerade versucht dieses beu zu beschreiben. Oder sehe ich das falsch?
|
01.03.2006, 11:05:38
|
Junior Member
|
|
Registriert seit: Apr 2005
Beiträge: 309
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Heppi
Naja, hier wird aber nicht geprüft ob das File gesperrt ist oder nicht.
|
Weiß nicht, wie "file" funktioniert. Wie kommst Du darauf, dass es trotz eines gesperrten Files einen Zugriff auf die Datei hinbekommt?!
Zitat:
Zitat von Heppi
Hier würde sich doch ausschließen, daß ein File geöffnet wird, wenn jemand anderes gerade versucht dieses beu zu beschreiben. Oder sehe ich das falsch?
|
Ich denke das hat MEIKEL in seinem letzten Beitrag klar gemacht?!
1. Du öffnest die Datei zum schreiben - Datei ist leer
2. ich lese die Datei ein - ist leer
3. Du lockst, schreibst Deine Daten rein - Alle Daten da.
Ich warte
4. Du gibst die Datei wieder frei und schließt sie.
5. Ich schreibe die gelesene leeren Daten und meinen Eintrag rein
Ergebnis : MEIN Eintrag ist der einzige der drin steht.
|
01.03.2006, 11:21:58
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Heppi
Sind jetzt alle sprachlos? ;-)
|
Nein. Für mich ist das Thema abgehakt. Dir steht es natürlich frei, Dir trotzdem die Finger an dem Ofen noch mal zu verbrennen.
|
01.03.2006, 11:43:15
|
Anfänger
|
|
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
|
|
AW: fopen() ohne Überschreiben
Zitat:
Zitat von Giz
Weiß nicht, wie "file" funktioniert. Wie kommst Du darauf, dass es trotz eines gesperrten Files einen Zugriff auf die Datei hinbekommt?!
|
Weil ich es ausprobiert habe.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 20:54:42 Uhr.
|