Verbindungen werden nicht mehr beendet

Hallo, ich habe aktuell bei einem Kundenprojekt folgendes Problem: Die Verbindungen zur MySQL-Datenbank werden nicht mehr geschlossen. Da der MySQL-Server selbst nur maximal 60 gleichzeitige Verbindungen zulässt, wird irgendwann folgende Fehlermeldung ausgeworfen: [quote]Fatal error: Uncaught exception ‚Zend_Db_Adapter_Exception‘ with message ‚SQLSTATE[08004] [1040] Too many connections‘ in /var/www/web1/htdocs/shop/engine/Library/Enlight/Components/Db/Adapter/Pdo/Mysql.php:101 Stack trace: #0 /var/www/web1/htdocs/shop/engine/Library/Zend/Db/Adapter/Abstract.php(316): Enlight_Components_Db_Adapter_Pdo_Mysql->_connect() #1 /var/www/web1/htdocs/shop/engine/Library/Zend/Db/Adapter/Pdo/Abstract.php(263): Zend_Db_Adapter_Abstract->getConnection() #2 /var/www/web1/htdocs/shop/engine/Shopware/Components/DependencyInjection/Bridge/Db.php(45): Zend_Db_Adapter_Pdo_Abstract->exec(‚SET @@session.s…‘) #3 /var/www/web1/htdocs/shop/cache/proxies/Shopware201504021339ProductionProjectContainer.php(146): Shopware\Components\DependencyInjection\Bridge\Db->factory(‚pdo_mysql‘, Array) #4 /var/www/web1/htdocs/shop/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php(326): Shopware201504021339ProductionProjectContainer->getDbService() #5 /var/www/web1/htdocs/shop/engine/Shop in /var/www/web1/htdocs/shop/engine/Library/Enlight/Components/Db/Adapter/Pdo/Mysql.php on line 101 503 Service Unavailable[/quote] Ich hatte zunächst den Verdacht, dass hier persistente Verbindungen aufgebaut werden und diese eben nicht mehr geschlossen werden. Daher wurden folgende Einstellungen in der php.ini geändert: ALT mysql.allow\_persistent = On mysql.max\_persistent = Unlimited mysqli.allow\_persistent = On mysqli.max\_persistent = Unlimited NEU mysql.allow\_persistent = Off mysql.max\_persistent = 60 mysqli.allow\_persistent = Off mysqli.max\_persistent = 60 Leider hat dies wohl nicht zum erhofften Erfolg geführt. Vom Hoster habe ich gerade die Prozessliste mit aktuell 31 laufenden Verbindungen erhalten. Alle Verbindungen haben den gleichen Inhalt, daher hier die erste: [quote]*************************** 1. row *************************** Id: 5755 User: web1db1 Host: localhost db: db_web1_1 Command: Query Time: 47888 State: Copying to tmp table Info: SELECT a.id AS id, REPLACE(ROUND(ap.price * (100+t.tax) / 100, 2), ‚.‘, ‚,‘) AS grossFee, ROUND(ap.price, 2) AS netFee, aa.attr19 AS protectedAmountDecimal, aa.attr20 AS protectionDurationInt, ad.ordernumber AS tsProductID FROM s_articles AS a INNER JOIN s_articles_attributes AS aa ON a.id = aa.articleID INNER JOIN s_articles_details AS ad ON a.id = ad.articleID INNER JOIN s_core_tax AS t ON t.id = a.taxID INNER JOIN s_articles_prices AS ap ON a.id = ap.articleID AND ap.pricegroup = ‚EK‘ AND ap.from = 1 WHERE CAST(aa.attr19 AS SIGNED) >= ‚1227‘ AND ad.ordernumber LIKE ‚%EUR‘ ORDER BY CAST(aa.attr19 AS SIGNED) ASC LIMIT 1 [/quote] Ich freue mich auf Eure Ideen/Tipps/Lösungsvorschläge! Vielen Dank schon mal! Gruß Bernhard

Folgende Nachricht habe ich abschließend an den Kunden und den Hoster verfasst (sollte bei dem ein oder anderen das gleiche Problem auftreten) __________________________ START ___________________________ Problemstellung Auf der Seite von [Kunde] wurden Verbinden aufgebaut und nicht beendet bzw. liefen nahezu endlos, was die Serverlast dermaßen erhöhte, dass bei einer gewissen Grenze ein Ablehnen weiterer Verbindungen die Folge war. Behebungsversuche Um sogenannte persistente Verbindungen zu verhindern wurden die Einstellungen in der php.ini wie folgt gesetzt: mysql.allow_persistent = Off mysql.max_persistent = 60 mysqli.allow_persistent = Off mysqli.max_persistent = 60 Leider war der Fehler damit aber nicht behoben und die Anzahl der laufenden MySQL-Querys wuchs erneut auf über 50. (normal sind bei der aktuellen Nutzerrate ca. max 5 in Spitzenzeiten auch mal kurrzeitig bis zu 10). Es wurde festgestellt, dass die Hauptlast von Querys verursacht wurde, welche sich im Status “Copying to tmp table” befanden. Daraufhin wurden in MySQL folgende Werte gesetzt: max_heap_table_size = 67108864 (= 64M) tmp_table_size = 67108864 Dennoch kam es erneut zu einer hohen Anzahl laufender Querys. Die relevanten Querys befinden sich in einem der folgenden Stati: - storing result in query cache - Copying to tmp table Der Shop selbst umfasst ca. 1200 Artikel davon sind ca. 450 aktiv. Dies ist eine vergleichsweise überschaubare Anzahl an Artikeln. Andere Shopware-Shops, welche auch von [Hoster] gehostet werden, funktionieren mit weit über 10.000 Artikeln ohne Probleme. Es kann somit nicht davon ausgegangen werden dass dieses Problem durch Shopware versacht wird. Vielmehr schein dieses Problem am MySQL Server oder dem Host des MySQL Servers zu liegen. Mögliche Analyse-Ansätze wären u.a. die Prozessorlast, eventuell gesetzte Speicherlimits oder nichtgesetzte Timeouts. Dies sollte durch [Hoster] überprüft werden. Leider fehlen mir die Einblicke in die Server-/vServer-Umgebung von [Hoster], weshalb ich die Ursache des Problems nicht weiter prüfen kann. Workaround Damit die Erreichbarkeit der Seite durch oben genanntes Problem nicht weiter beeinträchtigt wird, habe ich ein PHP-Skript geschrieben, welches alle MySQL-Prozesse welche seit über 300 sek. (=5 Min) laufen killt. Dieses Skript wird bei jedem Aufruf der Seite mit aufgerufen und wird sich daher nicht auf die Geschwindigkeit der Seite auswirken. Sollten hierdurch z.B. Datenexporte oder Datenimporte gestört werden, kann dieser Wert auf 500 erhöht werden. Die entsprechende Datei heisst mysql_kill_long_querys.php und befindet sich im Hauptverzeichnis des Shops. Die ebenfalls hinzugefügte Datei mysql_show_long_querys.php zeigt alle aktuell laufenden Querys (entspricht “SHOW FULL PROCESSLIST”). Sie dient der Überprüfung der Funktionalität und sollte bis auf weiteres nicht gelöscht werden. Abschließend Von meiner Seite gilt das Problem der Fehlermeldung und nichterreichbarkeit des MySQL-Servers damit als behoben. Dennoch sollte [Hoster] die Ursache der langen Querys prüfen und bestenfalls beheben. __________________________ ENDE ____________________________ Die Datei mysql_kill_long_querys.php hat folgenden Inhalt: [code]<?php $host = ‘’; //Hostname
$user = ‘’; //Username
$pass = ‘’; //Password
$name = ‘information_schema’;

$conn = new mysqli($host, $user, $pass, $name);

if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } if ($result = $conn->query(“SELECT * FROM PROCESSLIST”)) { while($row = $result->fetch_object()) { if($row->TIME > 300) { mysqli_kill($conn,$row->ID); } } $result->close(); } $conn->close();[/code]

Siehe post132711.html?hilit=index#p132711 Viele Grüße