Avatar billede dmg Nybegynder
09. januar 2010 - 03:27 Der 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!

Webserver IIS 6.0
Connection timeout - 600 seconds
Enable HTTP keep-alives - YES
Website Connection - Unlimited

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
Avatar billede arne_v Ekspert
09. januar 2010 - 03:36 #1
Siger du at du kan få fejlen hvis du er eneste bruger på siden og bare laver refresh ?
Avatar billede arne_v Ekspert
09. januar 2010 - 03:36 #2
Hvordan er PHP integreret med IIS ? ISAPI ? CGI ? FASTCGI ?
Avatar billede dmg Nybegynder
09. januar 2010 - 05:14 #3
Hej Arne_v,

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...
Avatar billede arne_v Ekspert
09. januar 2010 - 05:25 #4
Er du sikker på at du får lukket alle forbindelser i din kode?
Avatar billede dmg Nybegynder
09. januar 2010 - 05:50 #5
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.

<?php

class Database
{
        private $sHost;
        private $sUser;
        private $sPassword;
        private $sDatabase;
        private $link;

        function __construct()
        {
                $this->configReader();
        }

        // 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);
        }

        // Læser konfigurationsfilen conf.php
        private function configReader()
        {
                include $_SERVER["DOCUMENT_ROOT"] ."/conf.php";
                $this->sHost = $sDbHost;
                $this->sUser = $sDbUser;
                $this->sPassword = $sDbPassword;
                $this->sDatabase = $sDbDatabase;
        }
}
?>
Avatar billede dmg Nybegynder
09. januar 2010 - 05:54 #6
ups... jeg fik byttet om på beskrivelserne:
1. executeMultiRowQuery - returner 2-dimonsionelt array
2. executeSingleRowQuery - returner et array
3. executeNonQuery - returner intet
Avatar billede dmg Nybegynder
12. januar 2010 - 20:03 #7
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.
Avatar billede dmg Nybegynder
25. august 2010 - 21:57 #8
Hej Arne,

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