Moin!
Hättest Du Dein Skript vorher lokal getestet. Ja, genau mit dem dauerhaft offenen Browserfenster. Gern auch mit PHP als CGI. Es ist eine verflixt gute Idee, sich eine Testumgebung aufzubauen, die der realen Umgebung möglichst nahe kommt. Virtuelle Maschinen eignen sich wunderbar dafür.
Nun der Fehler trat tatsächlich auf, weil ich den Test lokal nur über max. 5 min gemacht habe.
Ich hab ganz einfach nicht mit so einem Fehler gerechnet.
mysql_pconnect() führt dazu, jeder einzelne Apache-Thread, der Webseiten ausliefert und das pconnect ausführt, eine dauerhaft bestehende Verbindung zur Datenbank aufbaut. Der Apache erlaubt in Standardkonfiguration 150 Threads parallel, nach oben ist aber kein Limit beim Konfigurieren.
Es ist nicht sichergestellt, dass der Request deines Browsers immer vom gleichen Apache-Thread bedient wird. Es wird eher so sein, dass im Laufe der Zeit jeder Thread eine eigene Verbindung zur Datenbank eröffnet.
Das bedeutet: Die Datenbank hat am Ende so viele Verbindungen offen, wie der Apache maximal Threads erlaubt. Erlaubt die Datenbank weniger Verbindungen, als es Apache-Threads gibt, wird ein Teil der Threads die DB-Verbindung nicht durchführen können. Da aber dummerweise nicht bekannt ist, welcher Thread zur Bedienung eines Browserrequests genutzt wird, kann man auch keine vorrausschauende Filterung einbauen.
Am Ende reicht schon ein einziger Browser mit regelmäßigen Requests aus, einen ganzen Server mit einem einzigen pconnect-Skript in die Knie zu zwingen.
Nicht so ganz ernst gemeint die Frage, aber ich find den Schaden durch so ein kleines Script schon übel.
Ums mit Sven zu sagen: Optimiere kein Performanceproblem, das Du nicht hast.
Bahnhof.
Vinzenz bezieht sich auf mich und meine hier im Forum schon sehr häufig geäußerte Bemerkung, dass man erst dann mit Performanceoptimierung anfangen soll, wenn tatsächlich ein Performanceproblem besteht. Solange man kein Problem hat, sollte man sich immer der Standardmethoden bedienen, die überall benutzt werden.
Denn Performanceoptimierung gibt es nicht kostenlos. Sie erfordert in mehrfacher Hinsicht Aufwand (Analyse des Performanceproblems, der inneren Abhängigkeiten, Entwicklung einer geeigneten Performancemessung (nur was man in Meßwerten erfassen kann, kann man optimieren), Festlegung von "was ist optimaler" bei den Meßwerten, Entwicklung einer Umgehungs- und Verbesserungsstrategie des alten Algorithmus), und führt zwangsläufig dazu, dass der Code, der die gewünschte Funktion liefert, hinterher anders, nämlich komplizierter und komplexer, aussieht, als vorher.
Komplexerer Code ist aber schwerer zu warten, als einfacher Code. Wenn also der einfache Code die Aufgabe fast genauso gut löst, und noch kein Performanceproblem existiert, ist die Problemlösung mit dem einfachen Code immer der scheinbar optimierten Problemlösung mit komplexem Code vorzuziehen.
Denn noch etwas anderes kann passieren: Der optimierte Code könnte zwar bislang nicht real aufgetretene Performanceprobleme lösen, es können sich aber im täglichen Betrieb an ganz anderen Stellen viel eklatantere Performanceprobleme zeigen. Jetzt wird's gleich doppelt unangenehm: Es muss eine Problemlösung für dieses reale Problem her, aber gleichzeitig muss die irgendwie in den bereits schonmal vorher sinnlos optimierten und deswegen komplexeren Programmcode integriert werden. Das Resultat ist also gleich doppelt so komplex, wie es eigentlich sein müsste.
Es gibt einen schönen Spruch, der das dadurch entstehende Dilemma verdeutlicht: "Die Fehlerbehebung in einem Programm erfordert doppelt soviel Grips, wie zum Schreiben des Programms notwendig ist."
Wenn dieser Spruch wahr ist, gilt auch folgende Schlussfolgerung: "Jemand, der unter Einsatz seines gesamten Grips ein Programm geschrieben hat, kann dieses Programm nicht mehr von Fehlern befreien, weil dazu doppelt soviel Grips notwendig ist, wie er hat."
Deshalb: Programme immer so einfach wie möglich halten! Performanceoptimierungen sind erstmal nur unnötige Verkomplizierungen, die man sich solange schenken sollte, bis tatsächlich ein Problem existiert.
- Sven Rautenberg
--
"Love your nation - respect the others."