Avatar billede ostehamster Nybegynder
11. juni 2009 - 22:27 Der er 12 kommentarer og
1 løsning

Garbage collector, destructor m.m.

Hej

Jeg sidder med et problem med en database klasse der ikke rigtig virker efter hensigten.

Klassen har en constructor der åbner forbindelse og en destructor der lukker forbindelse. Problemet er at destructoren ikke rigtig bliver kaldt når jeg synes den skal :)

Hvis jeg f.eks. har:

<?php
function test() {
  $db = new DB();
  $db->do("SELECT * ....");
  ...
  ...
  return true;
}

while(1) {
  test();
}
?>

Så fejler scriptet, fordi der bliver lavet for mange samtidige forbindelser til databasen. Hvis jeg derimod sætter $db = null; før return, så virker det som det skal.

Kan det virkelig passe at garbagecollectoren ikke fjerner $db når den ryger "out of scope", altså når functionen returnere?

På forhånd tak

/Christoffer
Avatar billede Slettet bruger
11. juni 2009 - 22:37 #1
Det kan godt ske, at PHP's garbage collector ikke fjerner objektet, så snart det bliver overflødiggjort og i stedet virker med forsinkelse - hvilket giver problemet med det voldsomt store antal forbindelser.
Avatar billede ostehamster Nybegynder
11. juni 2009 - 22:53 #2
Jeg tror faktisk måske det er fordi jeg gemmer en reference i et andet object, som måske bliver gemt... Så måske det er mig der er problemet ;)
Avatar billede Slettet bruger
11. juni 2009 - 22:55 #3
Fejl 40? ;)
Avatar billede arne_v Ekspert
12. juni 2009 - 00:58 #4
Det er helt almindeligt for database connection klasser at have en close metode som kaldes så hurtigt som muligt.

Det er sikkert også godt i PHP.
Avatar billede Slettet bruger
12. juni 2009 - 01:48 #5
#4
Hvor "så hurtigt som muligt" betyder asynkront? Jeg er ikke sikker på, at jeg følger dig.
Avatar billede arne_v Ekspert
12. juni 2009 - 03:28 #6
Nej.

så hurtigt som muligt = lige så snart man er færdig med at bruge den connection
Avatar billede Slettet bruger
12. juni 2009 - 11:47 #7
Dvs. forbindelsen lukkes "øjeblikkeligt", når destructoren (og gennem den mysql_close) kaldes, så efterfølgende kode først afvikles, når forbindelsen med garanti er lukket?
Jeg tillader mig lige at skære det ud i pap for mig selv :)
Avatar billede Slettet bruger
12. juni 2009 - 11:49 #8
Ups, jeg tror, jeg misforstod dig :)
Man kalder mysql_close så hurtigt som muligt - men vil kaldet øjeblikkeligt lukke forbindelsen?
Avatar billede arne_v Ekspert
12. juni 2009 - 14:11 #9
Ja.
Avatar billede arne_v Ekspert
04. august 2009 - 03:53 #10
ostehamster?
Avatar billede ostehamster Nybegynder
19. august 2010 - 23:21 #11
Jeg blev da vidst lige væk her :) Nogen der vil have point?

Problemet var iøvrigt at jeg gemte en reference til $db, således at den aldrig røg ud af scope.
Avatar billede Slettet bruger
19. august 2010 - 23:56 #12
Arne?
Avatar billede arne_v Ekspert
20. august 2010 - 10:33 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester