|
| 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
| |
|
|