db-connectie sluiten of niet
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?
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 -
Heb jij dat wel eens gedaan en zo ja wat was het resultaat?
Nee, dat heb ik nog niet gedaan.
- 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
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?
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
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.
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
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 :-)