SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen
Hilfe Community Kalender Heutige Beiträge Suchen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #41  
Alt 28.02.2006, 02:30:16
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
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)
Mit Zitat antworten
  #42  
Alt 28.02.2006, 08:40:19
Heppi Heppi ist offline
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.
Mit Zitat antworten
  #43  
Alt 28.02.2006, 08:42:49
Heppi Heppi ist offline
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!?
Mit Zitat antworten
  #44  
Alt 28.02.2006, 09:43:04
Heppi Heppi ist offline
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_dateiLOCK_EX);

    
$log_inhalt "\n".file_get_contents($log_file);
    
ftruncate($log_datei0);

    
$log_inhalt "...|||||$log_inhalt";

    
flock($log_dateiLOCK_UN);
    
fclose($log_datei);
}
else{
    
$log_datei fopen($log_file'w');
    
flock($log_dateiLOCK_EX);

    
$log_inhalt "...";
}

fputs($log_datei$log_inhalt);
flock($log_dateiLOCK_UN);
fclose($log_datei); 

Geändert von Heppi (28.02.2006 um 10:52:49 Uhr)
Mit Zitat antworten
  #45  
Alt 01.03.2006, 08:49:30
Heppi Heppi ist offline
Anfänger
 
Registriert seit: Aug 2003
Ort: Leutkirch im Allgäu
Beiträge: 79
AW: fopen() ohne Überschreiben

Sind jetzt alle sprachlos? ;-)
Mit Zitat antworten
  #46  
Alt 01.03.2006, 09:50:59
Giz Giz ist offline
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?
Mit Zitat antworten
  #47  
Alt 01.03.2006, 10:52:36
Heppi Heppi ist offline
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?
Mit Zitat antworten
  #48  
Alt 01.03.2006, 11:05:38
Giz Giz ist offline
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.
Mit Zitat antworten
  #49  
Alt 01.03.2006, 11:21:58
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
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.
Mit Zitat antworten
  #50  
Alt 01.03.2006, 11:43:15
Heppi Heppi ist offline
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.
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
fopen Parameter Franzx PHP Grundlagen 5 19.01.2006 11:30:02
fopen() - Sicherheitslücke? Gweilo Off Topic Area 2 18.01.2005 17:55:43
fopen mit url gibt fehler ?! kruschde PHP für Fortgeschrittene und Experten 3 14.12.2004 15:02:28
Probleme mit fopen andi_g PHP für Fortgeschrittene und Experten 0 13.03.2004 17:02:09
Problem mit Array und fopen() DeMaephis PHP für Fortgeschrittene und Experten 1 07.12.2002 11:50:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:54:42 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt