Hallo iedereen,
Ik zit met een probleem, ik heb een eigen server (VPS) waarop 1 website staat die
per dag zo'n 5000 bezoekers heeft, op veel momenten als ik de website bezoek krijg ik
een To many connections error van Mysqli.
onderaan elk invoer php bestand heb ik $Sql->Close(); gezet.
dus hij sluit de connecties wel af.
Hoe kan ik dit oplossen of waar kan ik de max_connections hoger zetten.
mvg, Ben
- To many connections
-
12-02-2010, 12:48 #1
- Berichten
- 442
- Lid sinds
- 16 Jaar
To many connections
-
-
12-02-2010, 13:35 #2
- Berichten
- 2.392
- Lid sinds
- 17 Jaar
You can increase this value in main config file (e.g., /etc/my.cnf) using this syntax:
[mysqld]
set-variable=max_connections=5000
-
12-02-2010, 13:51 #3
- Berichten
- 935
- Lid sinds
- 17 Jaar
vreemd dat localhost een max_connections heeft uberhaupt.......
-
12-02-2010, 13:56 #4
- Berichten
- 292
- Lid sinds
- 16 Jaar
Inderdaad de max connections opschroeven.
Let wel op je load zodat je server niet in zijn geheel plat gaat als de mysql server teveel aangesproken wordt..
-
12-02-2010, 14:00 #5
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
Zorg er ook voor dat de connecties juist afgehandeld worden.
Weet niet hoe dat zit met php, maar vroeger had ik met asp dat de connecties open bleven staan en niet opnieuw gebruikt werden, waardoor er steeds meer connecties kwamen.
Je zegt dat je onder elk bestand de connectie closed, maar hoe zit dat als er een fout optreed.
Dus je moet een ook soort try {}catch(){close()} hebben.
-
12-02-2010, 14:03 #6
- Berichten
- 243
- Lid sinds
- 15 Jaar
@ wilbert
Hij geeft aan: onderaan elk invoer php bestand heb ik $Sql->Close(); gezet.
Dus dat heeft hij wel gedaan.
Als max_connections opschroeven niks helpt moet je gaan denken aan een 2e server en dan loadbalance.
-
12-02-2010, 14:09 #7
- Berichten
- 2.392
- Lid sinds
- 17 Jaar
Of gebruik maken van caching om queries te verminderen.. (Alhoewel dat inderdaad ook op een gegeven moment ophoud)
-
12-02-2010, 14:31 #8
- Berichten
- 170
- Lid sinds
- 16 Jaar
probleem is opgelost
Hallo,
Probleem van ben is inmiddel opgelost door deze code te plaatsen
[mysqld]
set-variable=max_connections=5000
tog bedankt :)
mvg,
Wesley
-
12-02-2010, 14:35 #9
- Berichten
- 442
- Lid sinds
- 16 Jaar
Inderdaad, heel erg bedankt iedereen.
Ik kan hiermee vooruit.
-
12-02-2010, 14:35 #10
- Berichten
- 2.392
- Lid sinds
- 17 Jaar
-
12-02-2010, 14:47 #11
- Berichten
- 548
- Lid sinds
- 16 Jaar
Er was ook iets met mysql_pconnect oid waardoor de connectie open bleef en niet na het uitveoren werd stopgezet
-
12-02-2010, 14:56 #12
- Berichten
- 169
- Lid sinds
- 17 Jaar
Het probleem van Ben is waarschijnlijk niet opgelost. Alhoewel hij op dit moment een tijdelijke oplossing heeft gevonden.....
Met max_connections=5000 kun je theoretisch gezien gelijktijdig 5000 bezoekers aan. Met gelijktijdig bedoel ik dat 5000 mensen op exact hetzelfde moment een databasebewerking opvragen. De VPS gaat dat natuurlijk nooit trekken.
Wat is zo'n beetje het maximum aantal bezoekers dat op een moment online is? 200?
Aangezien deze 200 gebruikers niet 100 x per seconde klikken op de site is in dit geval ook geen max_connections=200 noodzakelijk. De default optie (100 of 150 dacht ik) is dan meer dan voldoende.
Misschien zit er in het script een fout. Wordt er voor iedere query bijv. een aparte database connectie opengezet. Dan kun je wel aan het einde van het script de connectie sluiten, maar als je daarvoor al 20 connecties hebt geopend.... ontstaat er een probleem.
Als ik jou was, zou ik daar nog even naar kijken. Ik kan het mis hebben, maar wellicht kun je zo problemen in de toekomst voorkomen.
Dus mijn vermoeden:
- Voor elke query wordt een database connectie gemaakt
- Slechts aan het einde van het script worden de connecties gesloten.
2 oplossingen, waarvan er slechts 1 goed is:
- Niet voor elke query een connectie openen (goed)
- Na elke query de connectie weer sluiten (fout: elke keer een connectie maken kost te veel tijd)Laatst aangepast door peter molen : 12-02-2010 om 15:02
-
12-02-2010, 15:36 #13
- Berichten
- 442
- Lid sinds
- 16 Jaar
@Peter Molen
Ik denk dat het dan hieraan moet liggen.
Stukje code:
PHP Code:foreach ($tests as $test)
{
//check of die al in database staat
$check = $Sql->query( "SELECT COUNT(1) as id FROM tabel WHERE optie = '" . md5( $variable ) . "'" );
$show = $check->fetch_assoc( );
//zo niet...
if( $show[ 'id' ] == false ) {
//voeg hem toe in het database.
$Sql->query( "INSERT INTO tabel SET optie = '" . $variable . "'" );
}
}
$Sql->close();
Mvg, Ben
-
12-02-2010, 15:56 #14
- Berichten
- 169
- Lid sinds
- 17 Jaar
Hoe het beter kan, is op basis van de getoonde code niet/nauwelijks te zeggen...
Waarschijnlijk gaat het om de functie's $check->fetch_assoc( ) $Sql->query
...wellicht zie je dat daar elke keer een connectie wordt geopend...
-
12-02-2010, 17:29 #15
- Berichten
- 442
- Lid sinds
- 16 Jaar
De code die ik heb gegeven is de volledige code met natuurlijk de echt benamingen weg gehaald.
Boven de foreach staat alleen nog een stukje code waarmee die verbinding maakt met een andere server dit word in een array gezet en een voor een door de loop gehaald met de foreach.
Ik kan geen andere manier bedenken voor het controleren of er al iets van hetzelfde in het database staat.
Daarom als het aan deze code ligt , hoe kan ik dit verbeteren.
Mvg, Ben
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic