db-connectie sluiten of niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

06/02/2019 12:46:08
Quote Anchor link
Hallo,

Ik heb een site waarop bij iedere pagina-aanroep een database-connectie tot stand wordt gebracht. Nu vraag ik me af of jullie wel eens een database-connectie handmatig sluiten.

Zover ik heb begrepen sluit PHP zelf aan het eind van een script alle openstaande database-connecties en is het dus niet echt nodig om zelf nog handmatig de database-connectie te sluiten. Her en der lees ik op internet wel opmerkingen (veel zijn het er niet) van mensen die aangeven dat ze hun database-connectie tussentijds handmatig sluiten om resources vrij te maken.

Kortom de vraag is ... wie sluit er wel eens handmatig een database-connectie?
 
PHP hulp

PHP hulp

15/11/2024 11:05:14
 
- Ariën  -
Beheerder

- Ariën -

06/02/2019 13:49:01
Quote Anchor link
Ik heb het ooit in een ver verleden alleen gedaan omdat ik over moest schakelen op een andere database.
Verder ruimt PHP alle resources wel weer op.

Open eens een flinke dataset, en meet met http://php.net/manual/en/function.memory-get-usage.php hoeveel geheugen er als eerste en als laatste er gebruikt wordt. En doe dit zowel met een mysqli_close() als zonder.
Gewijzigd op 06/02/2019 14:29:55 door - Ariën -
 
Ozzie PHP

Ozzie PHP

06/02/2019 14:17:28
Quote Anchor link
>> Open eens een flinke dataset, en meet ...

Heb jij dat wel eens gedaan en zo ja wat was het resultaat?
 
- Ariën  -
Beheerder

- Ariën -

06/02/2019 14:29:28
Quote Anchor link
Nee, dat heb ik nog niet gedaan.
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2019 17:19:46
Quote Anchor link
- Ariën - op 06/02/2019 13:49:01:
Open eens een flinke dataset, en meet met http://php.net/manual/en/function.memory-get-usage.php hoeveel geheugen er als eerste en als laatste er gebruikt wordt. En doe dit zowel met een mysqli_close() als zonder.


Ten eerste, hoe het geheugengebruik wordt gemeten hangt sterk af van de API (connector) die wordt gebruikt om daadwerkelijk te communiceren met de database. Tegenwoordig is dit vaak de MySQL native driver.

Ten tweede, je hebt het hier over geheugen. Het is prima mogelijk om tussentijds queryresultaten vrij te geven. Dit is een veel betere gewoonte: geef resultaten gewoon vrij als je hiermee klaar bent, bijvoorbeeld omdat je de resultaten hebt weergegeven of alle relevante gegevens hebt overgebracht in een array in PHP.

Hiermee geef je tijdens een actieve connectie al geheugen vrij, dit in tegenstelling tot de situatie waarin je "ophangt als je klaar bent" ;). Je moet niet vergeten dat er parallel allerlei requests kunnen zijn, wat zou kunnen resulteren in hogere pieken geheugengebruik op enig moment. Deze pieken vlak je al (sterk) af als je tussendoor geheugen vrijgeeft.

En als je gaat voor een strategie waarbij je "zo snel mogelijk wilt ophangen" (wat dan een doel wordt waarschijnlijk?) hoe ziet dat er dan uberhaupt uit? Probeer je dan je queries naar voren te schuiven in je code of? Euh :/.

En dan nog de realisatie dat een connectie maar een hele korte periode bestaat.
En queries brak kunnen zijn.
En de intrinsieke servercapaciteit al te laag kan zijn voor wat je probeert te doen.

Er zijn een heleboel factoren die bepalen hoe efficient dit alles is. Het (zo snel mogelijk) aanroepen van een close() opdracht lijkt mij hiertoe geen oplossing.

Je hoeft niet te wachten met het (impliciet) vrijgeven van resources tot het moment van het verbreken van de verbinding met je database.
Gewijzigd op 06/02/2019 17:24:28 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

06/02/2019 17:24:24
Quote Anchor link
@Thomas,

Ik neem aan dat je met het tussendoor vrijgeven van geheugen doelt op de mysqli_free_result() functie ?


Als ik het dus goed begrijp dan sluit jij NOOIT een database-connectie via mysqli_close(). Begrijp ik je goed?
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2019 17:36:43
Quote Anchor link
> Ik neem aan dat je met het tussendoor vrijgeven van geheugen doelt op de mysqli_free_result() functie ?
Correct.

> Als ik het dus goed begrijp dan sluit jij NOOIT een database-connectie via mysqli_close(). Begrijp ik je goed?
Correct.

Van PHP.net:
Quote:
Open non-persistent MySQL connections and result sets are automatically destroyed when a PHP script finishes its execution. So, while explicitly closing open connections and freeing result sets is optional, doing so is recommended. This will immediately return resources to PHP and MySQL, which can improve performance.

Dus tenzij je script lang staat te stampen (dan zijn er mogelijk (andere) performance issues) kun je volgens mij prima volstaan met enkel het tussentijds vrijgeven van resources.

Dan nog iets: het opzetten van de connectie is ook een dure operatie. In dat opzicht zijn persistente connecties wellicht een optie, maar die hebben zelf weer een hoop haken en ogen. Als je dit niet direct nodig hebt zou ik deze niet gebruiken.

NB: wellicht valt er wel iets voor te zeggen om een functie/methode aan te roepen op het moment dat de connectie/het object waarin de connectie wordt bewaard wordt opgeruimd. Dit zou je kunnen doen met register_shutdown_function(). Bijvoorbeeld als je zelf wat expliciete cleanup wilt doen ofzo.

EDIT: uitzondering, waarbij ik eigenlijk niet goed weet wat er geldt. Op het moment dat je een of meer records locked in een transactie (SELECT ... FOR UPDATE) is het waarschijnlijk geen goed idee om deze voortijdig vrij te geven :p. Ik neem aan dat je hiermee ook de locks ongedaan maakt, maar ik kan mij vergissen.
Gewijzigd op 06/02/2019 17:56:12 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

06/02/2019 18:03:01
Quote Anchor link
Allright, thanks :)

Dan zijn we het volgens mij wel aardig met elkaar eens.

Ik las op internet dus ook dat sommigen hun databaseconnectie helemaal aan het eind van het script nog afsluiten. Op zich ergens ook wel weer 'netjes' omdat je de connectie ook opent. Waarom zou je 'm dan niet ook even sluiten. Ik weet alleen niet of dat nog een voordeel zou kunnen hebben dat je 'm zelf sluit.
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2019 19:13:18
Quote Anchor link
Maar zelfs dan, als je deze een paar milliseconden eerder kunt sluiten (terwijl dus alle resources op dat moment al zijn vrijgegeven als je dit tussentijds doet), wat heeft dat dan (nog) voor meerwaarde? Ik denk dat je dan beter kunt investeren in het optimaliseren van queries en dergelijke, zodat je script sneller klaar is en daarmee de connectie-tijd effectief omlaag gaat. Ik zou haast zeggen: natuurlijk is het wat efficiënter, maar op dat punt is het waarschijnlijk een micro-optimalisatie. Het kan geen kwaad, maar ik doe het niet :p.

EDIT: en je hebt dus mogelijk nog cleanup te doen (register_shutdown_function()). Als op dat moment de connectie al weg is, dan kan dit niet meer. Dus dat zou een argument voor het niet afsluiten zijn: je sluit dan dingen niet op voorhand uit (en af :p).
Gewijzigd op 06/02/2019 19:14:59 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

06/02/2019 21:06:17
Quote Anchor link
Haha. Ja je hebt wel gelijk. Áls het al optimalisatie is, dan is het micro-optimalisatie. Het is dan ook meer van een gevoel ... ik heb de deur zelf opengezet. Moet ik 'm dan ook niet even netjes dichtdoen. Dat idee zeg maar :-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.