Script zu langsam?

Gali

Mitglied
Hi,

weil mir hier nun schon 2 mal sehr gute geholfen wurde, hoffe ich, das es auch nochmal klappt. :)

Derzeit habe ich ein großes Problem mit meinen Programm. Ich bin drüber ein Browsergame zu programmieren. Nun bin ich bei einem der schwersten Teile des Programms. Ich erkläre es am besten an einem Beispiel:

Du besitzt ein Insel und möchtest jemanden angreifen. Du schickst eine Flotte von 10 Schiffen los. Das Script liest aus der Datenbank "inseln" aus, ob sie die 10 Schiffe hat, wenn ja:
- updatet er die Insel und zieht 10 Schiffe ab und
- schreibt in die Datenbank "Flotte" einen neuen Datensatz *greife Insel x an mit 10 Schiffen*

Nun habe ich das Problem, das einige folgendes schaffen:

Sie senden den Auftrag, und spamen F5 zum refreshen.
Aufruf 1 läd die Inseldaten und sieht das zb. 10 Schiffe da sind, doch bevor er die 10 Schiffe per update in der mysql Datenbank abziehen kann läd die Seite von Aufruf 2 schon die unupgedateten Inseldaten aus und meint: Ja sind 10 Schiffe drauf, lassen wir das Script weiter laufen. Währenddessen schickt Aufruf 1 die Flotte los und Aufruf 2 eben so.

Heißt es wurden 2x10 Schiffe abgeschickt, aber nur 10 bezahlt. Kam das Verständlich rüber? :)

Nun die Frage was ich machen kann. Ich hab schon bisschen was probiert.
ignore_user_abort(true); hilft nicht

Die Insel wird auch geupdatet, bevor die Flotte losgeschickt wird.
Sogar eine Zeile vor dem Update und den Flotteneintrag habe ich gecheckt ob die Insel noch die gleichen Daten hat wie zum Anfang des Scriptes.. es hilft alles nichts :(

Ich muss dazu sagen, dass das Programm bisher noch auf einen Webspace liegt und wie demnächst wohl auf einen Umziehen wo wir etwas mehr Geschwindigkeit erwarten können, dennoch muss es doch eine Möglichkeit geben, das es auch so funktioniert, hätte vlt. jemand eine Idee, wäre euch sehr Dankbar.

mfg Gali
 
Zuletzt bearbeitet:
Speichere einfach einen zufälligen Wert in einer PHP-Sitzung und schicke diesen auch im Formular mit. Im Skript prüfst du nun beide Werte und löschst den in der Sitzung. Wenn nun das Skript neu geladen wird, existiert der Wert in der Sitzung nicht mehr und die Aktion wird abgebrochen.
 
Und meinst du, er kann diese zufällige Zahl speichern bevor der 2. Aufruf checkt ob die Zahl nocht nicht verwendet wurden ist?

mfg Gali
 
Das Skript könnte etwa wie folgt aussehen:
PHP:
if( isset($_SESSION['uniqid']) && isset($_POST['uniqid']) && $_SESSION['uniqid']==$_POST['uniqid'] ) {
	unset($_SESSION['uniqid']);
	// alles war erfolgreich
} else {
	// Fehler!
}
 
Danke, es funktioniert :) - auch wenn ich mir nicht erklären kann warum es bei meiner Variante (kurz vor dem Update checken ob die geforderten Daten auf der Insel vorhanden sind) nicht funktionierte :)

mfg Gali
 
Kleine Update.. habe heute mitgeteilt bekommen, das es immer noch möglich ist:

PHP:
if(isset($_POST['c']) && isset($session_data[check]) && $_POST['c']==$session_data[check])
{$session_data[check]= mt_rand(000001,999999); mysql_query("UPDATE `session` SET `check` = 

'$session_data[check]' WHERE `id` =$session_data[id] LIMIT 1");}else{$error="Die Flotte muss von der Übersicht aus geschickt werden!";}

Ist doch zum Mäuse melken..
 
In dem Skript mit dem Formular notierst du folgendes am Anfang des Skriptes:
PHP:
<?php

	session_start();
	$_SESSION['uniqid'] = md5(uniqid(rand()));

?>
<form action="…" method="post">
<input type="hidden" name="uniqid" value="'.$_SESSION['uniqid'].'">
…
</form>
In dem verarbeitenden Skript dann schließlich oben Genanntes:
PHP:
<?php

	session_start();
	if( isset($_SESSION['uniqid']) && isset($_POST['uniqid']) && $_SESSION['uniqid']==$_POST['uniqid'] ) {
		unset($_SESSION['uniqid']);
		// alles war erfolgreich
	} else {
		// Fehler!
	}

?>
 
Vielleicht als kleine Anregung.
Ich habe selber schon ein Browsergame programmiert und ich habe eher Probleme mit den Querys gehabt, du solltest bei der Programmierung immer darauf achten das du Statements zu kurz wie möglich schreibst, nach der Optimierung lief meins z.B. mit ca 80% mehr Speed. Mitlerweile ärgere ich mich jedoch immer wieder, weil mann ja ständig dazulernt und mann nach einer Zeit immer mehr merkt, was mann besser machen könnte. Deswegen werde ich bald auch eine Reprogrammierung starten ;)
 
Zurück