09. januar 2010 - 03:27Der er
7 kommentarer og 1 løsning
PHP crasher mit system hvis siden loades mange gange eller på samme tid.
Hej experts,
Jeg har programmeret et stort og tidskrævende Inventory System og er endelig blevet tilfreds med resultatet og har rullet det ud til brugerne... men så fik jeg en ærgelig overraskelse :( Da brugerne begyndte at bruge systemet og indsætte mere data i mysql databasen, modtager jeg nu følgende besked:
Warning: mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10048) in E:\BGAN_Inventory\classes\database.php on line 93 Could not connect : Can't connect to MySQL server on 'localhost' (10048)
Systemet er skrevet Objekt Orinteret og bruger klassen database.php til at forbinde til databasen. Hver gang en forbindelsen bliver oprettet til mysql serveren og udfører en query bliver forbindelen lukket igen. Når jeg kigger på min Mysql Server Health Status i Mysql Administrator, kan jeg se ved et klik at der bliver fyret 1200 queries af. Jeg bruger også Nagios til at overvåge netværket og den har ca 11.000 current connections per second. Jeg er lidt nervøs nu og har virkelig brug for hjælp!
Mysql Server 5.1.32: Max Connection - 160 (Jeg modtager stadig ovenstående selvom der kun er 1 connection open.) Max Connection per User: Unlimited
Jeg tror det er måden PHP er sat op på. Hvis jeg f.eks. indlæser en side virker det fint. Hvis jeg derimod refresher den side 10 gange, modtager jeg fejl beskeden. Jeg er evigt taknemlig for en løsning! Forløbigt tak
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Tak for response! 1. Til din første kommentar, ja det er korrekt. Jeg kan være den eneste bruger på hele serveren og browser jeg stille og roligt rundt på hjemmesiden virker alt fint fint. Hvis jeg derimod refresher en side der lister måske 80 resultater 5-10 gange modtager jeg fejlen og kan kun se f.eks. 50 resultater eller slet ingen, men kun fejlen...
2. Da det er et stykke tid siden jeg satte denne server op kan jge ik huske detaljerne på opsætningen. Men kan se under "Web Service Extension" PHP ISAPI er sat til Allowed - c:\php\php5isapi.dll. Jeg ved desværre intet om CGI. Jeg har kun anvendt PHP og MYSQL til systemet, men kan se under "Web Service Extensions" at "All Unknown CGI extension" er sat til "Prohibited".
Lad mig endelig vide, hvis du skal bruge screenshots osv, så kan jeg sende på mail eller sådan noget...
Ja det er jeg ret sikker på. Alle SQL forspørgelser bliver kaldt via database klassen og den ser sådan her ud. Jeg bruger 3 metoder. 1. executeMultiRowQuery - returner et array 2. executeSingleRowQuery - returner 2-dimonsionelt array 3. executeNonQuery - returner intet
Alle mine klasser inkludere denne fil og bruger de ovenstående metoder til at fyrer queries af til databasen.
// executeMultiRowQuery bruges til at returnere to-demisionelle arrays public function executeMultiRowQuery($sSql) { $this->openConn(); $aaResult = mysql_query($sSql); if (!$aaResult) { die('<p>Invalid query: '.mysql_error()."</p>"); } while ($aRow = mysql_fetch_array($aaResult, MYSQL_BOTH)) { $aaEndResult[] = $aRow; } $iResultCount = mysql_num_rows($aaResult); mysql_free_result($aaResult); $this->closeConn(); if ($iResultCount > 0) return $aaEndResult; return null; }
// executeSingleRowQuery bruges til at returnere et array. public function executeSingleRowQuery($sSql) { $this->openConn(); $aResult = mysql_query($sSql); if (!$aResult) { die('<p>Invalid query: '.mysql_error()."</p>"); } while ($aRow = mysql_fetch_array($aResult, MYSQL_BOTH)) { $aEndResult = $aRow; } $iResultCount = mysql_num_rows($aResult); mysql_free_result($aResult); $this->closeConn(); if ($iResultCount > 0) return $aEndResult; return null; }
// executeNonQuery returnerer ikke noget, men bruges til insert, update og delete. public function executeNonQuery($sSql) { $this->openConn(); $aResult = mysql_query($sSql); if (!$aResult) { die('<p>Invalid query: '.mysql_error()."</p>"); } $iAffectedRows = mysql_affected_rows($this->link); $this->closeConn(); return $iAffectedRows; }
// safeString bruges til at køre strengen igennem med. Det er for sikkerhedsmæssige årsager at denne bruges, // så man ikke kan lave SQL injection attack. public function safeString($value) { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if (!is_int($value)) { $this->openConn(); $value = "'".mysql_real_escape_string($value)."'"; $this->closeConn(); } return $value; }
// openConn bruges til at åbne forbindelse til databasen. private function openConn() { $this->link = mysql_connect($this->sHost, $this->sUser, $this->sPassword) or die("<p>Could not connect : ".mysql_error()."</p>"); mysql_select_db($this->sDatabase) or die("<p>Could not select database</p>"); }
// closeConn lukker forbindelsen til serveren. private function closeConn() { mysql_close($this->link); }
Jeg bruger "include_once" på alle mine sider og hver gang jeg køre et script er der rigtigt mange sider der bliver inkluderet. Når man browser stille og roligt køre sitet som sagt fint, men hvis der er flere brugere vises ovenstående fejl. 1. Er der en optimismeret setup for php når mange sider bliver kaldt på en gang? 2. Er der en måde jeg nemt kan se de MySql queries der bliver sent til serveren når en side bliver kaldt måske response tiden.
Prøver at tænke på en måde jeg kan debugge problemet... Idet jeg er lidt lost... Vil med glæde uddele flere points! Tak for hjælpen.
Tak for kommentarer. Ville lige fortalle jeg i sin tid loste dette problem, ved at bruge en hurtigere server der korte IIS 7.5. Problemet loste sig selv. Endnu engang tak.
Synes godt om
Ny brugerNybegynder
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.