PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benutzerabruch


schaggel
19.10.2007, 11:26:42
Guten Morgen,

ich möchte folgendes Problem lösen, bin mir aber nicht sicher, wonach ich suchen muss,
um den richtigen Ansatz zu finden.

Ein kleines Script prüft und kopiert Dateien auf und von einem Webserver.
Da sowas ja bei der Benutzung durch mehrere User gleichzeitig etwas problematisch wird, möchte ich die Ausführung des Scriptes durch mehrere Benutzer gleichzeitig unterbinden.
Ein Thread weiter unten wurde die Möglichkeit einer "Kontrolldatei" aufgezeigt.
Das gefällt mir allerdings aus zwei Gründen nicht sonderlich.

1. Grund
Zum anlegen und löschen von Dateien benötige ich meist CHMOD 777, was mir nicht wirklich behagt.

2. Grund - viel mehr Kopfschmerzen bereitet mir dann das Entfernen der "Kontrolldatei".
Wenn das Script durch den Benutzer abgebrochen wird oder durch Verbindungsprobleme, kann ich meine "Kontrolldatei" am Ende des Scriptes nicht löschen und mein Script bleibt gesperrt.

Wie also kann ich sicherstellen, das auch in solchen Fällen das Löschen der Kontrolldatei definitiv erfolgt ?

Hat jemand eine andere Idee, wie ich solch eine Sperrung durchführen könnte (ohne Kontrolldatei) ?

Da in dem Script auch mit Sessions und einer Datenbank gearbeitet wird, wäre das vielleicht auch ne Möglichkeit. Statt der Kontrolldatei könnte man eben die Session in der DB löschen (Es wird die Session ID, die Benutzerkennung und der Scriptname in der DB gespeichert). Aber nach einem Abbruch muss auch diese gelöscht werden ....

Wonach muss ich mich umschauen ? Mit welchen PHP-Hausmitteln kann man das bewerkstelligen ?

Danke für eure Hilfe !

ms.be
20.10.2007, 04:00:29
Schreib doch beim Aufruf des Scriptes die aktuelle Zeit in die DB, und wenn schon vorhanden und länger als beispielsweise 5 min her, löschen und neu setzen. steht da dann eine Zeit drin die jünger als 5 min her ist, wird das Script nicht ausgeführt.

Sollte der User vorzeitig abbrechen, bleibt die Zeit zwar in der DB, edoch kann dann das Script spätestens nach 5 min wieder aufgerufen werden.

rambi
20.10.2007, 12:34:37
Wie also kann ich sicherstellen, das auch in solchen Fällen das Löschen der Kontrolldatei definitiv erfolgt ?
Quark!!
Die Datei muß doch gar nicht gelöscht werden!!
Wenn das Script beendet wird, egal wann und warum, werden alle offenen Dateien geschloßen und damit automatisch der Lock aufgehoben.
Zum anlegen und löschen von Dateien benötige ich meist CHMOD 777, was mir nicht wirklich behagt.
Auch Quark!! (zumindest in den meisten Fällen)
Für die Lockdatei brauchst du nur 0600 !!!!!!!
------
Ist dein PHP und Linux Handbuch kaputt?

sysop
20.10.2007, 14:30:29
zumindest, was das lock angeht, muss ich das gegenteil behaupten.

auf windows-servern z.b. funktioniert das lock nahezu garnicht, da windows nicht so ohne weiteres locken kann. locks sind in php nicht unproblematisch, da durch mehrere sitzungen (instanzen) des webservers in kombination mit locks leere schreibprozesse verursacht werden können. solange man in datenbanken schreibt, hat die ja auch noch ein wörtchen mit zu reden, bei dateien kann es leicht passieren, dass man plötzlich nichts mehr in der datei stehen hat.

ps.
sieh mal, was du unter ini_set("ignore_user_abort", TRUE) findest...

rambi
20.10.2007, 14:49:19
auf windows-servern z.b. funktioniert das lock nahezu garnicht, da windows nicht so ohne weiteres locken kann.
1. Wer benutzt schon FAT32 als Server Dateisystem??
2. In meiner XAMPP Umgebung tuts das Locking perfekt!!
3. Bis der TE nicht gesagt hat, welches System er benutzt ist das alles Wurscht!
4. Und "CHMOD 777" deutet für mich auf was Unixartiges!!

Ausserdem:
Wer Windowssever aufsetzt gehört auf die Streckbank!! ;-) ;-)

schaggel
21.10.2007, 15:42:24
Sollte der User vorzeitig abbrechen, bleibt die Zeit zwar in der DB, edoch kann dann das Script spätestens nach 5 min wieder aufgerufen werden.
Das kann ich mir im konkreten Fall sogar sparen, denn ich habe in der DB ein Tabelle,
in der die Sessions der User abgespeichert werden. Dort sind u.a. der Zeitstempel und der "Aufenthaltsort" des Users. Da ich die Daten dort schon habe, kann ich sie auch nutzen ... !
Das wird wohl der beste Weg sein.
Somit ist das Problem der Sperrung in meinem Falle wohl gelöst.
Danke für die Antworten.

ps.
sieh mal, was du unter ini_set("ignore_user_abort", TRUE) findest...
Habs mal überflogen, aber bisher noch nicht alles wirklich verstanden.
Ich möchte vermeiden, das beim Abbruch durch den Benutzer, ein eventuell gerade stattfindender Dateitransfer (Up-/Download auf den lokalen oder Remote-FTP-Server) abgebrochen wird.

sysop
21.10.2007, 17:01:03
1. Wer benutzt schon FAT32 als Server Dateisystem??
2. In meiner XAMPP Umgebung tuts das Locking perfekt!!
3. Bis der TE nicht gesagt hat, welches System er benutzt ist das alles Wurscht!
4. Und "CHMOD 777" deutet für mich auf was Unixartiges!!

Ausserdem:
Wer Windowssever aufsetzt gehört auf die Streckbank!! ;-) ;-)
volle zustimmung, vor allem zum letzten einwand, habe nur schon windows-server gesehen, die netzwerk-laufwerke eingebunden hatten, da klappt lock sehr häufig nicht.
ähnlich KANN es sich z.b. bei unixoiden netzwerk-laufwerken verhalten (schlagwort nfs). sich also auf lock zu verlassen, kann in manchen umgebungen zu problemen führen.

wer alles lokal macht, braucht auch kein lock, da ist er wohl der einzige, der an den daten rumfummelt.

Blade1965
23.10.2007, 13:53:25
Wie wäre es mit der MySQL-Funktion:

lock_table()

schaggel
23.10.2007, 23:39:31
Das wäre wenig hilfreich, denn ich will ja nichts in MySQL sperren.
In der DB ist aber gespeichert, in "welchem Script" ein User sich gerade aufhält.
Diese Info brauche ich nur abfragen und weiß, ob schon jemand am "werkeln" ist und
kann wietere ZUgriffe auf mein Script sperren.