/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Rovdrift på webhotel.
Fra : Ukendt


Dato : 21-02-04 17:36

Hejsa.

Jeg har en hjemmeside hvor jeg har lavet en helt nyt designl.
Det nye design lave temmelig mange kald til databaseni forhold til det
gamle (SELECT id, name osv osv.).

Da jeg vil smide det nye design on-line kom der efter få sec, en fejl
fra i PHP serveren. "Too many connection." Det forstår jeg jo ikke,
for jeg har prøvet mit nye design af på min egen lille Pentium 90 MHz
og der fungere det fint. Men min web-hotel påstår ikke at serveren er
overbelastet, og det har han sikkert ret i.

Jeg ved at på de fleste sider bliver der næsten altid lavet en 5 - 10
kald til databasen, og nogle af siderne kan der godt blive kaldt en 30
- 50 gange. Dvs. der hentes data med (SELECT ....).
Er det for voldsomt, at lave 30-50 kald til databasen, når der hentes
en side.? Specielt når der er mange kald, så henter jeg typisk en
overskrift fra en artikel ud fra et artikel id, og det må da være
kvikt overstået.

Kan jeg på nogen måde se hvormange kald til databasen (mysql_query())
jeg har lavet når jeg har afsluttet en side i PHP.?
Jeg kan jo manuelt tjekke det, men man kan nemt glemme noget, når det
meste er lavet med selvlavet funktioner.

Mit web-hotel har PHP og MySQL.

Dette er måske mere et database sprøgsmål, men nu må vi se.


--
....::Hilsen Erik

Min rigtige e-mail adresse findes på
http://home1.inet.tele.dk/ehh/e-mail.gif


 
 
Peter Brodersen (21-02-2004)
Kommentar
Fra : Peter Brodersen


Dato : 21-02-04 17:37

On Sat, 21 Feb 2004 17:36:18 +0100, Erik Hansen <mail.dk> wrote:

>Er det for voldsomt, at lave 30-50 kald til databasen, når der hentes
>en side.?

Den fejl, du får ("Too many connection.") betyder ikke, at du ikke kan
lave en forespørgsel, men at du ikke kan forbinde til
database-serveren.

Normalt laver man én forbindelse fra starten af, og sender så en lang
række forespørgsler over samme forbindelse. Det kunne godt tyde på, at
du her i stedet opretter en ny forbindelse til databasen, før hver
eneste forespørgsel, du vil sende.

--
- Peter Brodersen

Ugens sprogtip: saltomortale (og ikke saltomotale)

Ukendt (21-02-2004)
Kommentar
Fra : Ukendt


Dato : 21-02-04 19:13

On Sat, 21 Feb 2004 17:36:48 +0100, Peter Brodersen <usenet@ter.dk>
wrote:

>Normalt laver man én forbindelse fra starten af, og sender så en lang
>række forespørgsler over samme forbindelse. Det kunne godt tyde på, at
>du her i stedet opretter en ny forbindelse til databasen, før hver
>eneste forespørgsel, du vil sende.

Jeg laver også kun en forbindelse hvor jeg bruger mysql_pconnect.

$dbcon=mysql_connect("localhost","$user","$pass");
mysql_select_db("$db",$dbcon);

Men jeg sender jo en del mysql_query afsted, og som tidligere skrevet
så mente jeg at jeg sente 30-50 af sted.

Min udbyder har fortalt mig at der bliver dannet 5-6 Mbit trafik
mellem webserver og MySQL server, og det lyder jo helt vildt, så der
må været et eller andet som kører i ring.

Jeg tænkte på at jeg bruger global en masse steder, og specielt når
jeg har en funktion hvor jeg skal lave en kald til databasen, der
henter jeg database connectionen $dbcon med global, i stedet for at
overføre den som et slags argument i selve funktionskaldet.

Alt sådan gør jeg,

function WriteForm($id,$name) {
global $dbcon;
....
}

i stedet for

function WriteForm($dbcon,$id,$name) {
....
}

Men skulle der kunne ske noget ved at bruge global på denne måde.

--
....::Hilsen Erik


Esben Skov Pedersen (21-02-2004)
Kommentar
Fra : Esben Skov Pedersen


Dato : 21-02-04 19:29

Erik Hansen <mail.dk> wrote:

> Men skulle der kunne ske noget ved at bruge global på denne måde.

Nej db-serveren er ligeglad

/Esben

Ukendt (21-02-2004)
Kommentar
Fra : Ukendt


Dato : 21-02-04 20:55

On Sat, 21 Feb 2004 19:29:19 +0100, Esben Skov Pedersen
<spam@geek.linux.dk> wrote:

>> Men skulle der kunne ske noget ved at bruge global på denne måde.
>
>Nej db-serveren er ligeglad

Godt, jeg mente heller ikke det skulle have en påvirkning, men jeg er
jo ikke super ekspert i PHP og MySQL.

Når men min udbyder påstår at trafikken er steget med 1000% efter jeg
har smidt denne PHP fil på min webserver. Det skal sige at normalt
ligger der andre php filer på mit site. Min normale trafik er på 1,6
Gb pr. døgn, hvoraf jeg vil tror at halvdelen kommer fra SQL serveren.

Jeg er ikke i tvivl om at dette sikkert kan gøre bedre, men på min
egen linux server, fungere dette 100%, og der bliver lavet 8 kald til
SQL serveren.

Men har er php filen, HTML head og metatag er fjernet, det bre være
ligemeget.

---------------------------------------
set_magic_quotes_runtime(0);
// ------------------------ "Connect to the MySQL"
---------------------------------------
if ($SERVER_NAME == "linux.server") {
$dbcon=mysql_connect("localhost","xxxxx","xxxxxx");
} else {
$dbcon=mysql_connect("mysql.mods.dk","xxxxx","xxxxxx");
}
mysql_select_db("mods",$dbcon);
// EOF------------------------ "Connect to the MySQL"
---------------------------------------




function adv($advPlace) {
global $dbcon;

$week = strftime("%V");
$year = date("Y",mktime());
$ToDay = date("Y-m-d",gmmktime());

$Txt = "<p align=\"center\">";
$dbresult=mysql_query("SELECT id,go2url,advtag,newWindow,
((id*0)+rand()) AS random FROM advdata WHERE (advPlace = $advPlace AND
advActivated = 1 AND FromDate <= '$ToDay' AND ToDate >= '$ToDay')
ORDER BY random LIMIT 1",$dbcon);

while(list($id,$go2url,$advtag,$newWindow)=mysql_fetch_row($dbresult))
{

if ($id) { // Der er fundet aktivt banner.
$dbresult=mysql_query("SELECT adv_id,week,yearX,shown,click FROM
advlog WHERE adv_id = $id AND week = $week AND yearX = $year",$dbcon);

list($adv_id,$week,$year,$shown,$click)=mysql_fetch_row($dbresult);

if ($adv_id) {
mysql_query("UPDATE advlog SET shown = ($shown + 1) WHERE
(adv_id = $adv_id AND week = $week AND yearX = $year)",$dbcon);
} else {
$week = strftime("%V");
$year = date("Y",mktime());
mysql_query("INSERT INTO advlog(adv_id,week,yearX,shown,click)
VALUES('$id','$week','$year',1,0)",$dbcon);
}
if ($newWindow) {
$newWindow = " TARGET=\"_blank\"";
} else {
$newWindow = "";
}
if ($advtag) { // "If the adv TAG has been set, it is writen."
$Txt .= "<a href=\"goadv.php?id=$id\"$newWindow>$advtag</a>";
}
}
}
$Txt .= "</p>\n";
return $Txt;
}

?>
<table border="0" cellspacing="15" align="center" width="620">
<tr>
<td><? echo adv(2); ?></td>
<td><? echo adv(1); ?></td>
</tr>
</table>
---------------------------------------------


--
....::Hilsen Erik


Ukendt (21-02-2004)
Kommentar
Fra : Ukendt


Dato : 21-02-04 21:08

Ups.

Vil lige nævne at jeg tidligere har brugt mysql_pconnect tidligere i
stedet for mysql_connect, men det betyder vel ikke så meget.?

--
....::Hilsen Erik


Ukendt (22-02-2004)
Kommentar
Fra : Ukendt


Dato : 22-02-04 16:51

Erik Hansen wrote:
> Vil lige nævne at jeg tidligere har brugt mysql_pconnect tidligere i
> stedet for mysql_connect, men det betyder vel ikke så meget.?

Jo, det betyder en hel del. p'et står for persistent, dvs. der
laves en persistent=vedvarende forbindelse. Den nedlægges ikke
automatisk, når PHP er "færdig" med "arbejdet". Desuden kan man
heller ikke selv nedlægge dem. De timer selv ud efter et stykke
tid. Problemet ved dette er, at der på den måde oprettes for
mange forbindelse samlet set til databasen, hvilket jo var det
fejlbeskeden sagde.

Jeg ville derfor kun bruge mysql_connect (og kun lave en forbindelse,
der så bruges til alle kald)


--
Mvh.
Martin Møller Bæk
www.yavi.dk

Torben Stallknecht (29-02-2004)
Kommentar
Fra : Torben Stallknecht


Dato : 29-02-04 11:06

Erik Hansen <mail.dk> skrev:

> Hejsa.
>
> Jeg har en hjemmeside hvor jeg har lavet en helt nyt designl.
> Det nye design lave temmelig mange kald til databaseni forhold til det
> gamle (SELECT id, name osv osv.).
>
> Da jeg vil smide det nye design on-line kom der efter få sec, en fejl
> fra i PHP serveren. "Too many connection." Det forstår jeg jo ikke,
> for jeg har prøvet mit nye design af på min egen lille Pentium 90 MHz
> og der fungere det fint. Men min web-hotel påstår ikke at serveren er
> overbelastet, og det har han sikkert ret i.
>
> Jeg ved at på de fleste sider bliver der næsten altid lavet en 5 - 10
> kald til databasen, og nogle af siderne kan der godt blive kaldt en 30
> - 50 gange. Dvs. der hentes data med (SELECT ....).
> Er det for voldsomt, at lave 30-50 kald til databasen, når der hentes
> en side.? Specielt når der er mange kald, så henter jeg typisk en
> overskrift fra en artikel ud fra et artikel id, og det må da være
> kvikt overstået.
>
> Kan jeg på nogen måde se hvormange kald til databasen (mysql_query())
> jeg har lavet når jeg har afsluttet en side i PHP.?
> Jeg kan jo manuelt tjekke det, men man kan nemt glemme noget, når det
> meste er lavet med selvlavet funktioner.
>
> Mit web-hotel har PHP og MySQL.
>
> Dette er måske mere et database sprøgsmål, men nu må vi se.
>
>
> --
> ...::Hilsen Erik
>
> Min rigtige e-mail adresse findes på
> http://home1.inet.tele.dk/ehh/e-mail.gif

Uden at være helt sikker, vil jeg forslå dig at lave en
mysql_close($connection); når du er færdig med at slå op i database.
Det kræver selvfølgelig at du forbinder igen, for hver gang du skal hente
noget fra databasen, men omvendt undgår du også at der er forbindelser der
ikke er lukket, på trods af at de ikke bruges.
Det skyldes formentlig at når der er nogen der har kigget på en side, og der
så kommer andre til, så har mysql ikke lukket forbindelse inden, og jo
flere gange det sker, jo større er snasynligheden for at man får opbrugt
antallet af mulige forbindelser.

--
Mvh
Torben Stallknecht
torben@FJERNEShamdenkloge.dk

Ukendt (29-02-2004)
Kommentar
Fra : Ukendt


Dato : 29-02-04 11:30

Torben Stallknecht wrote:
> Uden at være helt sikker, vil jeg forslå dig at lave en
> mysql_close($connection); når du er færdig med at slå op i database.

Det hjælper bare ikke noget, hvis man bruger mysql_pconnect, da
mysql_close ikke lukker persistente forbindelser.

> Det kræver selvfølgelig at du forbinder igen, for hver gang du skal hente
> noget fra databasen, men omvendt undgår du også at der er forbindelser der
> ikke er lukket, på trods af at de ikke bruges.

Hvis man bruger mysql_connect (dvs den ikke persistente), så
lukkes forbindelsen automatisk, når PHP er "færdig". Jeg mener
så, at det vil være bedre kun at åbne en forbindelse en gang
og så bruge den hele vejen. Så kan man enten lade PHP selv
lukke forbindelsen eller lukke den eksplicit. Så skal man ikke
åbne en forbindelse mange gange.

> Det skyldes formentlig at når der er nogen der har kigget på en side, og der
> så kommer andre til, så har mysql ikke lukket forbindelse inden, og jo
> flere gange det sker, jo større er snasynligheden for at man får opbrugt
> antallet af mulige forbindelser.

Hvis der bruges en persistent forbindelse, skal kan det være et problem
at der kommer mange forskellige og åbner siden, hvorved der skabes for
mange forbindelser.
Hvis der ikke bruges en persistent forbindelse, så skal der rigtig mange
besøgende til, for at der er mange forbindelser åbent på samme tid.

--
Mvh.
Martin Møller Bæk
www.yavi.dk

Søg
Reklame
Statistik
Spørgsmål : 177518
Tips : 31968
Nyheder : 719565
Indlæg : 6408647
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste