PHP-Skript darf nur einmal laufen?

Alice

Erfahrenes Mitglied
Warteschleife in PHP-Skript

Hallo. :)

Gibt es in PHP die Möglichkeit das ein Skript nur einmal laufen darf? Sprich wenn es bereits am arbeiten ist, kann es nicht während dessen bei einem anderen User auch laufen.

Das einzige was mir einfällt wäre das mit einem Datenbankeintrag zu lösen.

Beim Start des Skripts wird eine bestimmte Tabelle in der Datenbank auf die Werte "0" und "1" geprüft.

0 = Frei
1 = Besetzt

Wenn in der Tabelle "0" eingetragen ist, wird dies zu einer "1" geändert und das Skript ist somit in Arbeit. Am Ende des Skriptes wird die "1" wieder zur "0" geändert.

Gibt es evtl. eine bessere Lösung?

Denn wenn ein User das Skript ausführen möchte aber es aktuell besetzt ist, soll nicht so ein blöder Hinweis wie "PHP-Skript momentan besetzt" oder so erscheinen.

Am besten wäre eine Lösung wo dann eine Meldung kommen würde wie "Sie stehen an Position 2 an. Bitte haben Sie einen kurzen moment Geduld". Und sobald es fertig ist, soll das Skript laufen.
 
Zuletzt bearbeitet:
Dann mach eine Stack-Tabelle.
Eintrag wenn Script startet. Den Eintrag löschen wenns beendet ist.
So können sich die EInträge Stappeln...
 
Einen Stack kannst du dir ganz einfach vorstellen:
Du hast eine Ablage und schmeißt einfach alles drauf was du erledigen willst, das wird dann der Reihe nach abgearbeitet. Das neue Script wird allerdings nicht automatisch anfangen, dafür müsstest du PHP ein Signal schicken und das unterstützt PHP so nicht. Du bräuchtest dafür entweder ein Script was die ganze Zeit im Hinterrgund läuft, was allerdings nicht ganz so einfach ist. Oder du lässt es generell eine serveranwendung machen, z.b. mit Java.


Zur Ausgangsfrage: Du kannst ein PHP Script nicht blocken, mit der Datenbank wäre ein funktionierendes Workaround. Allerdings stelle ich mir die Frage wie lange dein Script läuft, weil normalerweise Scripte in wenigen ms durchlaufen.

Was mir gerade noch einfällt, allerdings nicht wirklich schön ist, wäre folgendes:
Du lässt, wenn das Script in Bearbeitung ist, eine Forschleife laufen, die du mit sleep() verlängerst. So kannst du Abfragen an welcher Position er sich befindet und ausgeben. Nach z.b. 10sek brichst du das Script ab und sagst der User solle es später noch einmal versuchen. Sollte in den 10sek das Script freiwerden, wird es ausgeführt.
Das ist nur ein Lösungsansatz wie es funktionieren könnte, empfehlen würde ich ihn aber nicht.
 
Allerdings stelle ich mir die Frage wie lange dein Script läuft, weil normalerweise Scripte in wenigen ms durchlaufen.

Das Skript läuft nicht extrem lange.

Aber das Skript wird an manchen Tagen locker über 500 mal aufgerufen. Ich habe mir eine kleine "Logdatei" ins Skript eingebaut und daraus kann man genau sehen das manchmal über 20-30 User das Skript praktisch gleichzeitig laufen lassen.

Im Skript werden Grafiken mit einer Größe von bis zu 8000x5000px usw. verarbeitet. Es wird auch sehr viel gerechnet. Am Ende des Skriptes werden auch noch ca. 20 Exec-Befehle (ImageMagick) abgearbeitet.

Ich denke nicht dass das so toll ist.
 
"Ich denke nicht dass das so toll ist" - soll was bedeuten?

"Es wird auch sehr viel gerechnet" - Darauf beruhen sämtliche Programmiersprachen.
 
"Ich denke nicht dass das so toll ist" - soll was bedeuten?

"Es wird auch sehr viel gerechnet" - Darauf beruhen sämtliche Programmiersprachen.

Ich denke das bei sovielen abrufen des Skriptes die Serverlast extrem erhöht wird. Ich sitze hier an einem Intel i7 und selbst mit dieser CPU brauche ich "ein paar ms mehr" um die Grafik zu öffnen.

http://www.saskiaelsas.de/sims3/hubble/bilder/galaxie_08.jpg

Ich habe gelesen das ImageMagick Befehle auch ziehmlich Serverlastig wären und diese Kombination (großes Skript, große Grafiken, viel zu rechnen und IM-Befehle) ist sicher zu Rechenintensiv.

Was ich eigentlich brauche ist eine "Warteschleife". Vielleicht mir Java oder so.
 
Die Idee mit der Stacktabelle ist gut.

Du kannst das System so aufbauen:

1) Eintrag in die Datenbank schreiben
2) Prüfen, welcher Eintrag am ältesten ist. Hierzu brauchst du ein Feld "Status": 1 = ausstehend, 2 = in Bearbeitung
3) Wenn kein Eintrag in Bearbeitung ist, nimmst du den ersten ausstehenden Eintrag, mit der kleinsten ID (sollte auto_increment sein); wenn etwas in Bearbeitung ist = Skript abbrechen
4) Am Ende des Skripts, nach Abarbeitung des Eintrags, löscht du diesen und machst eine Abfrage, ob noch Einträge ausstehend sind. Wenn ja, goto zum Anfang des Skripts.

Keine Ahnung ob das so funktioniert, wär aber eigentlich logisch machbar. :D
 
Sei mir nicht böse, aber bevor du sowas in Java programmieren kannst, lass dir das lieber programmieren. Ansonsten löse es über Ajax, damit kannst du zumindest ein neuladen der Seite seitens des Users vermeiden.
 
Ja an Ajax hatte ich auch gedacht.

Aber wie immer habe ich keine Ahnung wie das geht.

Kann man eigentlich auch eine Art "Abfrage" irgendwie mit dem "Submit" Button verbinden? So dass das Skript dann erst gar nicht geladen wird und ein "Ladenbalken (Kreis)" dargestellt wird und der Submit Buttun erst verfügbar wird, wenn das Skript wieder frei ist.
 
Zurück