Zur Startseite Im Prinzip ist diese Überschrift schon paradox, denn schließlich muss jedes PHP-Skript von Haus aus mehrplatzfähig sein. Schließlich besteht immer die Möglichkeit, dass mehr als ein Besucher gleichzeitig auf die Seite zugreift. Jedoch sind sich viele Programmierer dieser Tatsache oft nicht wirklich bewusst. Daher kommt es häufig zu Fehlern, die nur sporadisch auftreten und sehr schwer zu finden sind.
Wie aber testet man, ob eine Anwendung wirklich mehrplatzfähig und damit Web-fähig ist? Schließlich wäre es recht umständlich, jedes mal zwei Leute anzurufen und zu bitten, eine bestimmte Internetseite genau zur gleichen Sekunde im Browser zu laden. Zumal eine wirkliche Gleichzeitigkeit auf diese Weise wohl kaum garantiert werden kann.
Die Lösung liegt darin, die kritischen Stellen vorher zu kennen. Weiß man nämlich, wo ein mehrplatz-Problem auftauchen könnte, kann man sich die betroffenen Programmzeilen genauer ansehen und einen gleichzeitigen zugriff zur mehrere Benutzer simulieren.
Advertisement/WerbungAls Beispiel habe ich hier ein triviales Stück Code gewählt. Ursprünglich wurde dieses Beispiel erstellt, um festzustellen, ob die Funktion mysql_insert_id() auch bei Mehrfachzugriff einwandfrei die letzte eingefügte ID anzeigt.
<?php
mysql_connect("localhost", "root");
mysql_select_db("testdb");
$sql = "create table dummy_tab (
id int primary key auto_increment
)";
mysql_query($sql);
echo mysql_error() . "<br>";
$sql = "insert into dummy_tab values (0)";
mysql_query($sql);
echo mysql_error();
$last_id = mysql_insert_id();
echo "last_id = $last_id<br>";
// simulate mult-user
// während der Sleep-Phase kann eine weiter Instanz dieses
// Skriptes aufgerufen werden
sleep(10);
// Zur Kontrolle, nochmal die letzte ID abfragen
$last_id = mysql_insert_id();
echo "last_id = $last_id<br>";
?>
Hier wird zunächst eine neue Tabelle angelegt. Der Aufruf von "echo mysql_error()" ist hier obligatorisch, sonst würde man eine Fehlermeldung des mySQL Servers nie zu sehen bekommen. Beim Anlegen der Tabelle muss jedoch nach dem ersten Aufruf immer eine Fehlermeldung kommen, weil die Tabelle dann schon existiert. Diese Meldung können wir erst mal ignorieren.
Anschließend wird in die frisch erstellte (oder schon vorhandene) Tabelle ein neuer Datensatz eingefügt. Das Feld mit dem Attribut "auto_increment" wird dabei vom Datenbankserver automatisch um eins erhöht. Die PHP-Funktion mysql_insert_id() liefert dann den letzten eingefügten Index zurück.
Wichtig ist hier die Zeile mit "sleep(10);", denn hier hat man die Möglichkeit, die gleiche Seite innerhalb der zehn Sekunden Schlafperiode in einer anderen Instanz des Browsers aufzurufen. Auf diese Weise lässt sich der gleichzeitige Aufruf der Seite simulieren.
Auch für andere Fälle ist diese Sleep-Methode geeignet. In diesem Beispiel wird bewiesen, dass mysql_insert_id() tatsächlich nur die "eigene" letzte ID zurück liefert. Interessanter wird es, wenn Sie in mehr als einer Tabelle Änderungen vornehmen wollen.
Hier sollten Sie sich dann fragen, was würde passieren, wenn jemand die Seite aufruft, während die Änderungen in der ersten Tabelle schon beendet sind, die Änderungen and der zweiten Tabelle aber noch nicht begonnen haben? Auch hier kann zwischen zwei INSERT bzw. UPDATE Statements ein sleep-Befehl den Mehrfachzugriff simulieren.
Hinweis: Diesen Text und die enthaltenen Beispielprogramme und Skripte dürfen Sie zum Erlernen der einzelnen Techniken und auch als Grundlage für Ihre eigenen Projekte auf eigene Gefahr kostenlos nutzen.
Bitte denken Sie daran, dass alle Texte und Quellcodes trotzdem urheberrechtlich geschützt sind. Eine direkte Weitergabe ist nur nach ausdrücklicher schriftlicher Genehmigung gestattet.