Moin!
Bis etwa 580 wiederholungen ist alles tutti und funktioniert so wie es soll. Zuerst dachte ich, dass ich an irgendeiner Stelle die Datenbankverbindung innerhalb der schleife nicht richtig schließe. Aber puste-kuchen, hab "sauber" gearbeitet.
Soll heißen, Du baust in einem PHP-Skript 580 x mal die Datenbankverbindung auf und wieder ab. Und wunderst Dich, dass dabei ein Problem entsteht. Das Problem ist entweder sehr akademisch oder Du hast ein heftiges Problem mit dem Konzept.** Erstens** die hohe Anzahl der Abfragen (vermutlich nutzt Du keine Joins) und erst recht die der immer neuen Verbindungen. Die kann man nämlich mehrfach nutzen. Und wenn Du vorher nicht weisst, ab wann Du die nicht mehr brauchst: Beim Skriptende kommt der Besenmann (bei PHP als CGI). Spätestens nach Abbau der HTTP-Verbindung auch beim PHP als Apache-Modul-
Ich habe gerade eben mit php 7.0.3 (PHP 7.0.3-9+deb.sury.org~trusty+3) beides getestet:
<?php
$i=0;
while (0) {
$mysqli = new mysqli();
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo ++$i . ' : Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
}
?>
[x] geht, bei ca. 50.000 manuell abgebrochen. Verbindung ging an localhost - also über socket, nicht port.
Zweiter Test:
<?php
$i=0;
while (1) {
$link = mysqli_connect();
if (!$link) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo ++$i . ' : Success... ' . mysqli_get_host_info($link) . "\n";
mysqli_close($link);
}
Ergebnis wie oben. Manuell abgebrochen.
In allen beiden Fällen ist aber die Serverlast nicht zu verachten. Ein Massenhoster wird Dir Limits setzen.
Dritter und vierter Test nicht zum localhost, sondern zur IP des Hosts (Aber NICHT: 127.0.0.1):
Abbruch spätestens bei knapp 30.000 (beide!), sehr viel früher wenn ich die Skripte direkt nacheinander neu starte. Ich vermute mal, die Ports werden nicht schnell genug frei gegeben.- Auch hier gilt, dass Dir womöglich kleinere Limits gesetzt wurden.
Jörg Reinholz