[php mysql] oplopende database connecties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
net nieuw hier, hopelijk kunnen jullie me helpen.

probleem: oplopend aantal connecties in MySql

ok in boven.php wordt via een databaseClass een connectie opgebouwd
de databaseClass wordt geinitialiseerd als $cDb en de connectie wordt in deze class geset als attribuut $db.

vervolgens worden er via een aantal classes die allemaal subclasses zijn van de databaseClass queries uitgevoerd.

in onder.php wordt de database connectie weer gesloten middels mysql_close($cDb->db).

het gaat om een website met gemiddeld 1500 sessies per dag.
provider klaagt over overbelasting van hun server door het overvloedig aantal database connecties wat genereerd wordt door de site.

als ik lokaal (php mysql onder windows) de mysql connecties check, blijven deze oplopen indien ik een nieuwe pagina opvraag of refresh, kortom wanneer er een database connectie wordt gemaakt. het lijkt er dus op dat de connectie aan het einde van de pagina niet geclosed wordt. probeer ik te database aan te spreken nadien mysql_close() is uitgevoerd, dan blijkt de connectie inderdaad gesloten.

nou blijkt op een linux server mysql_close() zowiezo geen zin te hebben, maar zou de verbinding automatisch verbroken worden na het executen van het script.

what to do?

Acties:
  • 0 Henk 'm!

  • nightowl
  • Registratie: April 2002
  • Laatst online: 14-03-2009

nightowl

always too early to sleep

Mijn kennis is zeker niet volledig en toereikend maar is het niet zo dat als je subclasses uitvoerd dat deze ook de connectie van de hoofdclass weer inherit. Ik bedoel hiermee, kan het niet zo zijn dat door het uitvoeren van meerdere subclasses van een databaseClass, telkens bij deze uitvoer een connectie gemaakt wordt, omdat deze connectie ook in de databaseClass gemaakt wordt. Als dit nl het probleem is zou je de subclass wat moeten aanpassen om het default gedrag te 'overriden'

Ik pas in mijn jas. Mijn jas past in mijn tas. Dus ik pas in mijn tas.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nightowl schreef op 09 januari 2003 @ 21:51:
Mijn kennis is zeker niet volledig en toereikend maar is het niet zo dat als je subclasses uitvoerd dat deze ook de connectie van de hoofdclass weer inherit. Ik bedoel hiermee, kan het niet zo zijn dat door het uitvoeren van meerdere subclasses van een databaseClass, telkens bij deze uitvoer een connectie gemaakt wordt, omdat deze connectie ook in de databaseClass gemaakt wordt. Als dit nl het probleem is zou je de subclass wat moeten aanpassen om het default gedrag te 'overriden'
in de constructor van de databaseClass wordt de connectie met mysql opgebouwd. Als ik in de constructor een javascript alert output kan ik exact zien wanneer de constructor van de moederclass (databaseClass) wordt uitgevoerd. In boven.php worden zeker 5 objecten geinitialiseerd waarvan de classes subclasses zijn van de databaseClass. indien bij het initialiseren van de subclasses eveneens de constructor van de moederclass zou worden uitgevoerd dan zou ik dus 5 javascript alerts moeten krijgen en dat blijkt niet te gebeuren, mits je een constructor in de subclass heb gedefinieerd (zo niet, dan wordt de constructor van e moederclass uitgevoerd en dus nog een connectie gestart, maar dit is in geen enkele subclass het geval).

het klopt ook dat die constructor van de databaseclass 1 keer uitgevoerd wordt, aangezien het aantal connecties per refresh oploopt met 1.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ik denk sowieso dat je clientside en serverside een beetje door elkaar haalt. Maar ik weet bijna wel zeker dat nightowl gelijk heeft.

Op dit moment worden er echt 1 connectie per subclasse aangemaakt! Extenden is een 'is a' relatie, terwijl hier juist een 'has a' relatie van toepassing is. Het beste is om 1 db connectie object aan te maken, en dit object als parameter aan alle constructoren van die andere classes meegeven. Dan gebruik je maar 1 connectie per pagina.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mwah nie door elkaar halen toch? als ik na het uitvoeren van een mysql connectie in de code een echo "<script......"; zet met daarin een alert dan krijg ik toch elke keer als die code om te connecten uitgevoerd wordt een output "<script....." of ben ik nou gek?

PHP:
1
2
3
4
5
6
7
$this->db = mysql_connect($hostname,$username,$password) or die ("<script language=\"javascript\">\n<!--\nwindow.location=\"dberror.html\";\n//-->\n</script>");
?>
<script language="javascript">
<!--
alert('connect');
//-->
</script>

[ Voor 37% gewijzigd door Verwijderd op 09-01-2003 22:21 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

In php+mysql wordt maar 1 connectie gemaakt en open gehouden in je pagina als je daar dezelfde connectie-parameters (server, password, user) meegeeft.

Ongeacht of je nou twintig keer mysql_connect aanroept in tien subclassses.

Wat mij eerder het geval lijkt is dat je met mysql_pconnect werkt, dit lijkt soms goed te werken maar je houdt daardoor wel erg veel connecties open (per apache-child process 1 ipv in totaal maar 1) en is in de praktijk minder zinvol dan zou moeten zijn.

Mocht je dus met mysql_pconnect werken, vervang dat dan door mysql_connect.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zie bovenstaand, heb ge-edit, sorry voor de layout

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Humm, in principe zou php de connectie ook moeten sluiten aan het eind van de pagina, het is beter om zelf netjes mysql_close aan te roepen, maar in principe zou het niet hoeven...

Hoewel ik wel af en toe voorbij heb zien komen dat php er af en toe bugs in gehad heeft, om welke php-versie gaat het?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 09 January 2003 @ 22:20:
In php+mysql wordt maar 1 connectie gemaakt en open gehouden in je pagina als je daar dezelfde connectie-parameters (server, password, user) meegeeft.

Ongeacht of je nou twintig keer mysql_connect aanroept in tien subclassses.

Wat mij eerder het geval lijkt is dat je met mysql_pconnect werkt, dit lijkt soms goed te werken maar je houdt daardoor wel erg veel connecties open (per apache-child process 1 ipv in totaal maar 1) en is in de praktijk minder zinvol dan zou moeten zijn.

Mocht je dus met mysql_pconnect werken, vervang dat dan door mysql_connect.
nope geen pconnect, wat ga ik die provider vertellen dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP Version 4.2.3

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 09 January 2003 @ 22:19:
mwah nie door elkaar halen toch? als ik na het uitvoeren van een mysql connectie in de code een echo "<script......"; zet met daarin een alert dan krijg ik toch elke keer als die code om te connecten uitgevoerd wordt een output "<script....." of ben ik nou gek?

PHP:
1
2
3
4
5
6
7
$this->db = mysql_connect($hostname,$username,$password) or die ("<>");
?>
<script language="javascript">
<!--
alert('connect');
//-->
</script>


De code in de or die() wordt trouwens alleen uitgevoerd als je mysql_connect niet lukt. Wat je dan beter kan doen is iets als:
mysql_connect(...);
echo("... je script-code ... ");

Dat had je dus al, beetje onduidelijke code als het zo breed is :)

Maar als je $hostname,$username,$password steeds hetzelfde zijn zou er in principe maar 1 werkelijke connectie actief mogen zijn binnen je code...
Uiteraard als er twintig bezoekers tegelijk zijn, heb je ook twintig verbindingen tegelijk open, maar die verbindingen zouden weer gesloten moeten worden.

En dat laatste gebeurt dus niet?

[ Voor 8% gewijzigd door ACM op 09-01-2003 22:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
provider beweert dat er op een pagina meerdere connecties worden geopend, dit zou oplopen tot 20. ze hebben hiervoor mijn code 'moeten analyseren' (kuch kuch) en durven daar zelfs nog kosten voor in rekening te brengen....... maaaaaaaaaaaaaar omdat dit de eerste keer is dat ik foutieve code produceer (kuch kuch) hoeft het niet betaald te worden, maar ik moet binnen een bepaalde termijn het probleem opgelost hebben.

sjah.......
staat jouw uitleg ergens hard gedocumenteerd wat betreft de connecties? ik check wel ff wat sites. dit is trouwens de eerste keer dat een provider (voor mij een nieuwe) hiermee komt. bij verschillende andere projecten werk ik op exact dezelfde manier en heb ik nooit klachten gehad van de provider met betrekking tot het aantal databaseconnecties.

[ Voor 31% gewijzigd door Verwijderd op 09-01-2003 22:47 ]


Acties:
  • 0 Henk 'm!

  • Shagura
  • Registratie: Augustus 2001
  • Laatst online: 14-09 08:25
Verwijderd schreef op 09 January 2003 @ 22:45:
provider beweert dat er op een pagina meerdere connecties worden geopend, dit zou oplopen tot 20. ze hebben hiervoor mijn code 'moeten analyseren' (kuch kuch) en durven daar zelfs nog kosten voor in rekening te brengen....... maaaaaaaaaaaaaar omdat dit de eerste keer is dat ik foutieve code produceer (kuch kuch) hoeft het niet betaald te worden, maar ik moet binnen een bepaalde termijn het probleem opgelost hebben.

sjah.......
staat jouw uitleg ergens hard gedocumenteerd wat betreft de connecties? ik check wel ff wat sites. dit is trouwens de eerste keer dat een provider (voor mij een nieuwe) hiermee komt. bij verschillende andere projecten werk ik op exact dezelfde manier en heb ik nooit klachten gehad van de provider met betrekking tot het aantal databaseconnecties.
Ik ken zeker niet het hele verhaal, heb het verhaal dus maar van een kant gehoord en ben uiterst sujectief:

Ik weet niet wat voor 'provider' je bedoelt, maar als het een bedrijf is die je website host waar jij voor betaalt zou ik gewoon tegen ze zeggen dat ze niet moeten zeiken als jij je gewoon aan je contract houdt, ik zou ook gelijk van een bedrijf met zo'n asociale houding afstappen omdat het in principe gewoon nergens op slaat. Als je vage code op je site wilt plaatsen mag dat toch gewoon :? :|

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Shagura schreef op 09 January 2003 @ 22:55:
[...]

Ik ken zeker niet het hele verhaal, heb het verhaal dus maar van een kant gehoord en ben uiterst sujectief:

Ik weet niet wat voor 'provider' je bedoelt, maar als het een bedrijf is die je website host waar jij voor betaalt zou ik gewoon tegen ze zeggen dat ze niet moeten zeiken als jij je gewoon aan je contract houdt, ik zou ook gelijk van een bedrijf met zo'n asociale houding afstappen omdat het in principe gewoon nergens op slaat. Als je vage code op je site wilt plaatsen mag dat toch gewoon :? :|
het zou volgens hun gaan om code die overvloedige databasebelasting zou veroorzaken

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

www.php.net/mysql_connect
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thnx
documentatie zegt genoeg dus!

Acties:
  • 0 Henk 'm!

  • smaij
  • Registratie: November 2000
  • Laatst online: 10:44
Btw sinds wanneer bestaat er overerven en subclasses in php ? :?

Ik wil geen namen noemen maar is die hosting toevallig DWH (initialen.. geen naam:) )? Heb daar zelf negatieve ervaringen mee op hetzelfde gebied, altijd hetzelfde connectie verhaaltje etc..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
smaij schreef op 10 January 2003 @ 00:02:
Btw sinds wanneer bestaat er overerven en subclasses in php ? :?

Ik wil geen namen noemen maar is die hosting toevallig DWH (initialen.. geen naam:) )? Heb daar zelf negatieve ervaringen mee op hetzelfde gebied, altijd hetzelfde connectie verhaaltje etc..
http://www.php.net/manual/en/keyword.extends.php

nee niet DWH

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

smaij schreef op 10 January 2003 @ 00:02:
Btw sinds wanneer bestaat er overerven en subclasses in php ? :?

Al iig sinds versie 4.0, misschien wel langer...

Acties:
  • 0 Henk 'm!

Verwijderd

Zijn er eigenlijk richtlijnen voor wanneer je mysql_connect en mysql_pconnect gebruikt?
Hoe kun je nu het beste inschatten wanneer het zinnig is pconnect te gebruiken?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je heel vaak achter elkaar heel kort de connectie nodig hebt is het zinvol.
Maar als je niet vaak of niet kort de boel nodig hebt is het al niet zinvol meer.

En daarbij is het ook geen echte connectie pool met php, helaas, waardoor de efficientie van een pconnect er ook nog een beetje bij in schiet door het feit dat je veel meer connecties tegelijkertijd open hebt staan.
Pagina: 1