Können php Scripts parallel laufen?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ablaufen
auto
code
datei
datum
frage
gast
gleichzeitig registrieren
info
jemand
laufen
leute
liga
nutzen
platzhalter
problem
sagen
sekunde
url
zelle
-
Ich habe ein Script, welches einen User registriert.
Dabei ist es wichtig, dass selbst wenn sich 2 User gleichzeitig registrieren, die Scripte hintereinander ausgeführt werden.
Jetzt meine Frage: Wenn man ein php Script 2 mal gleichzeitig aufruft, wird das Script, dann mal mal gleichzeitig unabhängit ausgeführt oder hintereinander. Oder wo man das einstellen kann. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da der Server multithreaded ist können PHP-Scripts parallel laufen. Verlass dich also niemals darauf, dass 2 Aufrufe auch hintereinander ausgeführt werden!
-
Aus welchen Gründen ist es den wichtig wann der User registriert wurde?
Auch wenn die Wahrscheinlichkeint, dass 2 benutzer sich exakt zur gleichen Zeit registrieren nicht sehr groß, aber auch nicht ausgeschlossen und daher sollte ein Script damit umgehen können.
Wenn du uns die Herangehensweise des Scripts erläutern könntest könnte man das von dir angesprochene 'Problem' sicher umgehen.
MFG -
Nimm doch einfach in MySQL auto increment Her, dass geht dann immer.
-
für die Id nehm ich schon auto increment.
Gibt es eine Möglichkeit Sicher zu stellen, dass die Scripts nacheinander ausgeführt werden. Wenn nicht kann es zu Problemem komme, da sonst 2 User den gleichen Platzhalter nutzen, der vorher für sie gespielt hat. -
Wenn du die Platzhalter über DB laufen lässt, dann kannst du diese als reserviert, belegt oder frei definieren und entsprechend an dein Script übermitteln. So hast du das Problem dann nicht mehr.
-
das dürfte dein kopfzerbrechen mildern.
in keinem computer läuft 'gleichzeitig' irgend etwas. alles der reihe nach ;)
ja und für die, die es kommentiern wollen, dass es um v2.6 geht, auch vorher ist nichts gleichzeitog gegangen. (so was blödes aber auch :)) -
unlikus schrieb:
Ich habe ein Script, welches einen User registriert.
Dabei ist es wichtig, dass selbst wenn sich 2 User gleichzeitig registrieren, die Scripte hintereinander ausgeführt werden.
[...]
Gibt es eine Möglichkeit Sicher zu stellen, dass die Scripts nacheinander ausgeführt werden. Wenn nicht kann es zu Problemem komme, da sonst 2 User den gleichen Platzhalter nutzen, der vorher für sie gespielt hat.
Auch wenn czibere grundsätzlich recht hat, solltest Du deinen Ansatz überdenken. Eine im Web erreichbare Seite zeichnet sich halt dadurch aus, daß sie von vielen Usern nahezu gleichzeitig aufgerufen/verwendet werden kann. Wenn dein Skript eine serielle Ausführung zwanghaft verlangt, solltest Du den Background und die Gestaltung des Skriptes überprüfen und überarbeiten.
-
yo mey!
ich habe da etwas vergessen, und zwar: darauf hinzuweisen, dass parallel und gleichzeitig nicht das selbe, ja sogar nicht einmal das gleiche sind. was parallel läuft, muss nicht zwingend gleichzeitig laufen.
(aber das ist leider die übliche haarspalterei des faches ;) -
ansonsten gibt es noch die möglichkeit, sich einen stack aufzubauen, den man dann seriell abbauen lässt. ist nur die frage, wie du den User so lange hinhälst, bis der abgebaut ist...
dazu kannst du eine temporäre tabelle bauen, die dann von einem Prozess geleert wird. darüber kannst du dann auch anti-Flood-Control machen, falls wer bissel mehr aufmerksamkeit will...
über Ajax könntest du die User dann auf die warteschlange setzen, bis der stack bis zu ihrem jeweiligen EIntrag/Prozess/wasauchimmer abgebaut ist...
hoffe, das wäre für den TE ein sinnvoller Ansatz. Ansonsten würd ich noch das Wort Transaktionen in die Runde werfen... -
huch!
da schießt man mit kanonen auf spatzen ;)
also nochmals kurz gefasst: wenn 1000 neue user innerhalb einer sekunde sich anzumelden versuchen, kommt sicherlich nicht vor, dass nur 2 von denen gleichzeitig (das heißt: bis auf die letzte nachkommastelle(?) genau!!) angemeldet werden!
die kurze erklärung ist, dass irgendein prozess/thread dem anderen vorgezogen wurde - warum auch immer (nochmals oben lesen :) -
Eventuell sollten wir uns alle ein wenig bremsen und darauf warten, daß unlikus erklärt, was genau das "kann es zu Problemem komme, da sonst 2 User den gleichen Platzhalter nutzen" sagen soll.
Hat er da etwas falsch verstanden, oder ist dieser "Platzhalter" (was auch immer er damit meint, liegt ja noch im Dunklen) wirklich ein Problem?
Problemlösungsvorschläge, ohne das Problem zu kennen, Haarspaltereien und Spatzenkanonen sind wirklich wenig hilfreich.
Beitrag zuletzt geändert: 12.11.2012 1:13:39 von fatfreddy -
unlikus schrieb:
..., da sonst 2 User den gleichen Platzhalter nutzen, der vorher für sie gespielt hat.
ich vermute mal, die Besucher können schon ohne Anmeldung als "Gast" aktiv werden (Spielen)
und wenn dieser Gast sich dann als "User" anmeldet, dann sollen die bisher als Gast gespielten
Ergebnisse (Spieler-Daten) auch für den neuen User-Account übernommen werden.
Wahrscheinlich wird dem "Gast" ein "Platzhalter" (z.B. Timestamp) als ID zugewiesen
damit die Gast-Spieler-Daten gespeichert und dann für User übernommen werden können,
Es geht also wohl darum, den Besucher (als User) eindeutig zu identifizieren (und zuordnen) zu können.
Wenn Du auch jeden Gast in MySQL mit auto-increment speicherst, kannnst Du ja diese ID nehmen,
... geht auch wenn Du nicht in MySQL sondern die "Gast" Daten in einer _SESSION speicherst
auch wenn zwei Gäste gleichzeitig zu Spielen beginnen,
dann sollte ja die Session-ID je Gast auch eindeutig sein.
$gast_sid = session_id(); // ------ oder ------ $gast_sid = $_COOKIE["PHPSESSID"];
... oder gelcih je Gast ein "echtes" COOKIE anlegen ?
... zudem könntest Du eine Komination aus Timestamp und IP-Adresse zur "Erkennung" nehmen
$user_hash = md5( $timestamp . $userip );
Es gibt viele Möglichkeiten, jedem Gast (Besucher der spielt) eine eindeutige ID zu-zuwweisen.
wichtig ist halt, dass jeder "Gast" eindeutig zugeordnet werden kann, dann ist die Reihenfolge egal
Beitrag zuletzt geändert: 12.11.2012 11:01:14 von erlebnis -
Nein es gibt nicht die Möglcihkeit als gast du spielen. In dem Spiel gibt es ligen und wenn die noch nicht voll sind gibt es platzhalter und die dürfen nicht bei der registration doppelt verwende werden. ich brauche auf jeden Fall eine Möglcihkeit die scripte immer hintereinander ablaufen zu lassen
-
ach für so ein ding brauchst du keine Transaktionen... sollen die leute ihre ligen selbst auswählen oder sollen die automatisch zugewiesen werden?
automatische Zuweisung ist kein thema, weil SQL-inserts/updates nacheinander laufen. du kannst nach der eintragung ja checken, ob du das limit der platzhalter überschritten hast, dann trägst du denjenigen wieder aus und in die nächste rein... bis fertig...
Wenn dir das zu unprofessionell it, kannst du dich auch an eigenen Transaktionen versuchen... -
Das registrierungsscrip ist sehr komplex und das problem lässt sich nicht so einfach lösen. Ich brauche auf jeden Fall eine Lösung bei der ich sicherstellen kann, dass sich nicht zwei Leute gleichzeitig registrieren
-
fatfreddy schrieb:
genau ;)
Eventuell sollten wir uns alle ein wenig bremsen und darauf warten, daß unlikus erklärt, was genau ...unlikus schrieb:
unlikus! du wiederholst dich und ich kann (wiederholt) nur sagen, dass es nicht möglich ist, dass 2 (oder mehr) leute sich gleichzeitig anmelden! (ich weiß es nicht, ob das jetzt endlich rüberkommt).
Das registrierungsscrip ist sehr komplex und das problem lässt sich nicht so einfach lösen. Ich brauche auf jeden Fall eine Lösung bei der ich sicherstellen kann, dass sich nicht zwei Leute gleichzeitig registrieren -
Hallo
czibere schrieb:
unlikus! du wiederholst dich und ich kann (wiederholt) nur sagen, dass es nicht möglich ist, dass 2 (oder mehr) leute sich gleichzeitig anmelden! (ich weiß es nicht, ob das jetzt endlich rüberkommt).
Soweit mir bekannt ist es sehr wohl möglich, dass zwei 2 Sachen gleichzeitig ausgeführt werden. Das führt dann bei z.B. Browsergames zu "Ressourcenverdopplungen" o.ä. .
Mir hat da mal jemand ein paar Takte drüber erzählt, ich erinnere mich nur nicht mehr so genau an die Lösung. Evtl. war es mit Cronjobs (Script geht nacheinander die Neuanmeldungen durch)?
Oder auch mit Ajax, ich bin mir ziemlich sicher, dass das bei Universitäten für Kursanmeldungen eingesetzt wird (weil sich alle um x Uhr anmelden). Damit kenne ich mich aber nicht wirklich aus und kann keine Lösungsansätze bieten.
mfg -
Wie stellst Du Dir eine Lösung mit Cronjobs vor? Dann werden die Anmeldungen doch erst nach einer Weile ausgeführt, oder wie meinst Du das?
Und zur Frage: Ist es nicht so, dass MySQL alle Anfragen nacheinander abarbeitet? Sonst gäbe es doch keine eindeutigen Auto-Increments... -
Hallo
tobiworlds schrieb:
Wie stellst Du Dir eine Lösung mit Cronjobs vor? Dann werden die Anmeldungen doch erst nach einer Weile ausgeführt, oder wie meinst Du das?
Und zur Frage: Ist es nicht so, dass MySQL alle Anfragen nacheinander abarbeitet? Sonst gäbe es doch keine eindeutigen Auto-Increments...
Öh naja, der Cronjob kann doch alle paar Sekunden ausgeführt werden?
Es scheint so zu sein, dass gewaltige bugs auftreten können, wenn mehrere Befehle zur gleichen Zeit verarbeitet werden sollen. Womit das etwas zu tun hat (Kernel, Multicore-CPU, "ist halt so") weiß ich nicht, aber ich denke die Frage des TE ist schon berechtigt, habe die Fehler in einem Amateur-Browsergame hautnah miterleben können. :P
mfg -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage