Avatar billede lone_a_p Praktikant
15. maj 2011 - 14:33 Der er 8 kommentarer og
1 løsning

mysql_close, mysql_free_result eller ingenting

Kære eksperter,

Jeg har tidligere haft problemer med at min virtuelle server gik ned pga. for mange åbne queries (eller noget i den retning).

Jeg har nu fået stabiliseret koderne ved at benytte mysql_close og mysql_free_result nogle steder.

Jeg har blot ét åbent spørgsmål: hvornår skal man egentlig bruge dem. Rent performancemæssigt synes jeg at kunne måle mig frem til, at disse lukninger/frigørelser også tager tid, så nogle gange er det bedre at undlade og blot lade scriptet køre ud.

Så er der nogen der har bud på, hvornår man skal benytte mysql_close og mysql_free_result - og hvornår man skal undlade?

Mvh Lone
Avatar billede wanze Nybegynder
15. maj 2011 - 14:53 #1
mysql_free_result() bruges kun til at frigive hukommelse, og hjælper derfor ikke på det problem du beskriver. Funktionen bør kun benyttes, hvis man er bange for, at man løber tør for hukommelse i løbet af udførslen af scriptet. Når scriptet er udført frigives hukommelsen alligevel automatisk. Du kan derfor godt undlade at frigive den manuelt overhovedet.

Ligeledes bliver mysql_close() kaldt i slutningen af scriptets udførsel, hvorfor det også undre mig, at du overhovedet har behov for den, med mindre din side har en rigtig lang kørselstid. For at være sikker kan du dog kalde mysql_free_result(), når du ikke længere har behov for at være forbundet til din database - dvs. når du ikke længere skal lave flere forespørgsler.

Dog undrer det mig, at der overhovedet er relevant for dig. Det er aldrig et problem jeg er stødt ind i. Hvad skyldes, at du laver så mange forespørgsler?
Avatar billede lone_a_p Praktikant
15. maj 2011 - 16:45 #2
Hej og tak for svar.

Jeg har altid bare åbnet for databasen øverst i hvert script (mysql_connect), men nu har jeg så flyttet det ned til, når jeg skal bruge det.

Mener du, at det skyldes at jeg har mange forespørgsler? - og ikke blot at de tager lang tid?
Avatar billede wanze Nybegynder
15. maj 2011 - 17:04 #3
Ja, jeg tror umiddelbart, at der er noget galt med din side. Som sagt har jeg aldrig selv oplevet behov for at begrænse den slags. Standard MySQL-konfigurationen tillader, at man har 151 forbindelser åben til siden ad gangen, og at man kan lave 75000 forespørgsler i timen. Det er altså ret høje tal. Hvis vi siger, indlæsningen af en side tager et halvt sekund, så skal du have over 15.000 sidevisninger i minuttet for at der på et tidspunkt statistisk vil være mere end 151 åbne forbindelser.
Avatar billede lone_a_p Praktikant
18. maj 2011 - 17:14 #4
Siden er godt besøgt - men dog ikke 15000 sidevisninger i minuttet.

Jeg har nogle sider der tager flere sekunder om at indlæse - og det er som om når én bruger indlæser en tung side, så berører det en anden.

Samtidig kan én bruger også slæbe rundt på den "tunge tid", således at alle sider hun besøger tager lang tid at hente.

Jeg har prøvet nogle forskellige ting med mysql_close og mysql_result og det har hjulpet lidt, men det er stadig ikke nok. Jeg er også ved at finde ud af noget med nogle manglende index - det har også hjulpet ;)

Så jeg tror egentlig bare, at det er blevet langsomt af at jeg længe bare har ladet den køre af sig selv.

Hvis man skal lære noget om sådan noget databaseopsætning og performance, hvor vil du så anbefale at jeg går hen? Nogle gode bøger, kurser, nogle jeg kan få til at kigge på det (det er mere end bare lige at kaste et blik på)?

Mvh Lone
Avatar billede wanze Nybegynder
18. maj 2011 - 18:33 #5
Hmm, ja det er et godt spørgsmål med kurser og bøger. Det er desværre ikke noget jeg rigtigt kender til, nok også fordi jeg finder det ret unødvendigt. Du nævner selv indeksering, hvilket er nok den aller vigtigste ting, når det kommer til databaser - der SKAL være en primær nøgle! Foruden det (og sund fornuft), så synes jeg ikke der er behøv for kurser eller bøger.

Dog er caching (som jeg også nævner i den anden tråd) et stort skridt i den rigtige retning.

Du må dog gøre et eller andet helt forkert, når en side kan tage flere minutter om at indlæse. Hvor mange/hvilke MySQL-forespørgsler har du på den side?

Har alle dine tabeller nu en primær nøgle, helst med AUTO_INCREMENT?
Avatar billede lone_a_p Praktikant
18. maj 2011 - 22:59 #6
Ikke flere minutter ;-) Men i værste tilfælde får jeg tilbagemeldinger på 40 sek :-/ Dog ikke rigtig efter jeg har lavet lidt ændringer, men det kommer nok igen, for jeg har ikke helt styr på, hvad jeg har gjort. Jo, smækket nogle indexes på de rette steder samt mysql_close og mysql_free_result, men når jeg ikke har helt styr på det, er jeg ikke helt tryg ved, at det ikke kan komme igen.

Caching aner jeg absolut intet om - jo, det er vel et midlertidigt lager?? Men vil du evt. beskrive dette med et par ord, så jeg overhovedet ved hvad det er - og ikke mindst idéen er med det :-)

Mener at alle tabeller har en auto_increment, men skal lige kigge efter.
Avatar billede wanze Nybegynder
18. maj 2011 - 23:08 #7
Ja, jeg mente også sekunder. En indlæsning af siden skal absolut ikke tage flere sekunder!

Derudover kan mysql_free_result() faktisk gøre tiden langsommere, hvis det ikke er nødvendigt at frigive RAM. De bliver som bekendt automatisk frigivet, når scriptet er indlæst.

Ja, caching er et slags lager. Hvis du fx skal vise den samme side mange gange, så i stedet for at generere den på ny hver gang, så kigger serveren lige om den ikke har en brugbar kopi liggende, og sender den ud i stedet. Det betyder jo, at du kan spare serveren for mange forespørgsler.

Du har sikkert fra tid til anden bemærket, at hvis du på en side (også her på Eksperten) skriver en post e.lign., så kommer den ikke frem lige med det samme - der kan gå helt op til et par minutter før du kan se posten. Det skyldes caching: Serveren har travlt og vurderer, at du godt kan "leve" med den gamle, cachede version af siden lidt endnu, indtil den får tid til at generere en ny. Det kan også skyldes, at serveren bare ikke har opdaget, at der er kommet ændringer. Under alle omstændigheder, så er det pga. caching. :)

Det er jo ligesom, når din browser cache, så du slipper for at hente de samme billeder/dokumenter gang på gang, med mindre der er foretaget ændringer i dem.
Avatar billede lone_a_p Praktikant
20. maj 2011 - 22:50 #8
Ok, jeg troede det fungerede anderledes i mysql. Jeg kan ikke cache mine sider, da det alt sammen handler om, at brugeren indtaster data og får et resultat på skærmen. Det vil undre meget med gamle resultater, når man har indtastet noget nyt :-)

Jeg har bemærket den ekstra tid til mysql_free_result :) Så jeg benytter den blot hvis der har været store selects.

Jeg har læst mig frem til at hosts bliver blokket (og dermed hele siden) hvis der er 10 connects der bliver afbrudt.

Jeg har på fornemmelsen (og fra tests) at mit problem stammer fra langsomme loadtider i databasen. Når jeg tester performance på php, så får jeg ok tider, men tester jeg op imod mysql, er der nogle der oplever ventetider fra 10-60 sek. Heldigvis er det sjældent (få i timen), men jeg har ligeledes på fornemmelsen, at hvis ikke jeg får gjort noget ved det nu, så er det et problem der blot vil hobe sig op.

Nå, men jeg tror jeg ved, hvor jeg skal lede videre. Jeg siger tusind tak for dine svar, og håber at du også vil lægge et svar i stedet for en kommentar :)
Avatar billede wanze Nybegynder
21. maj 2011 - 14:56 #9
Det vil jeg så gøre - og god arbejdslyst! :)
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