Avatar billede Slettet bruger
05. januar 2004 - 20:45 Der er 17 kommentarer og
1 løsning

Avanceret optimering af PHP/MySQL ressourceforbrug

Jeg har lavet flere hjemmeside vha. php/mysql, og flere kører i øjeblikket med flere millioner hits om dagen. Derfor leder jeg efter metoder til at optimere ressourceforbruget.

Jeg vil våge at påstå, at jeg har styr på mysql indekser og mysql queries. Jeg kender dog intet til classer og php cache... kan disse to ting, eller andre, hjælpe mig til at presse væsentlig mere ud af mine servere, og i så fald, hvordan?
Avatar billede Slettet bruger
05. januar 2004 - 20:50 #1
Jeg bruger desuden RH linux 7.2, MySQL 3.23 og PHP 4.3 på en 1,3 ghz celeron maskine
Avatar billede Slettet bruger
05. januar 2004 - 21:10 #2
Så vidt jeg ved, kan klasser ikke hjælpe til at give bedre performance. Tværtimod.

En form for cache derimod, ville kunne gøre meget, hvis dine data er nogenlunde statiske.
Avatar billede Slettet bruger
05. januar 2004 - 21:13 #3
Kunne du eventuelt give nogle link til enkelte af dine sider?

Eventuelt kan du tage et kig på www.mysql.com som er fyldt med metoder til optimering af mysql-servere!
Avatar billede lsskaarup Nybegynder
06. januar 2004 - 01:30 #4
Du kan prøve at kigge på denne side: http://www-106.ibm.com/developerworks/websphere/library/techarticles/hvws/scalability.html.

Det er ikke for PHP eller MySQL, med derimod generelt om hvordan man kan øge kapaciteten, hastigheden og effektiviteten for hjemmesider, måske kan du bruge det. Der står i hvert fald lidt om bl.a. cache, men desværre ikke hvordan man kodemæssigt løser tingene, med om ikke andet så for inspirationen skyld.
Avatar billede codebase Praktikant
06. januar 2004 - 09:22 #5
cache er vejen frem..
jeg har lige kodet denne klasse som jeg selv benytter til at optimere en site, som flytter ca. 36Gb dagligt.
Avatar billede codebase Praktikant
06. januar 2004 - 09:23 #6
ups.

<?

// PMCS - Php Multi Cache System
// Copyright 2004 codebase
// Version 1.0 - 04.01.2004 01:40
//

class CacheObj
{
    function CacheObj()
    {
        global $DOCUMENT_ROOT;
       
        if ( substr( $DOCUMENT_ROOT, -1 ) != "/" )
        {
            $DOCUMENT_ROOT .= "/";
        }
       
        $this->CacheDir = $DOCUMENT_ROOT ."cache/";

        if ( !$this->FileName )
        {
            $filename = ereg_replace("/", "_" , getenv("SCRIPT_FILENAME") );
            $this->FileName = $filename;
        }
       
        if ( !$this->Periode )
        {
            $this->Periode = 3600;
        }
    }
   
    function Exists()
    {
        $opt = false;
        if( is_dir( $this->CacheDir() ) )
        {
            if ( !substr( $this->CacheDir() , -1 ) == "/" )
            {
                if( is_file( $this->CacheDir() . "/" . $this->FileName() ) )
                {
                    $opt = true;
                }
            }
            else
            {
                if( is_file( $this->CacheDir() . $this->FileName() ) )
                {
                    $opt = true;
                }
            }               
        }
        return $opt;
    }
   
    // default 1 hour ( 60 * 60 = 3600 )
    function setPeriode( $time = 3600 )
    {
        $this->Periode = $time;
    }
   
    function Periode()
    {
        return $this->Periode;
    }
   
    function CachedFileContent( $Content = 'none content' )
    {
        $ip = getenv("REMOTE_ADDR");
        $fp = fopen( $this->CacheDir() . $this->FileName(), "w" );
        fwrite($fp, "" . time() + $this->Periode . "\n<!-- \n\n\tThis file was created " . date("d/m-Y H:i:s") . " and having a valid periode in " . $this->Periode . "sec.\n\tThis cached file is create by $ip and brought to you by ZOLID.dk  \n\n-->\n" . $Content );
        fclose($fp);
    }
   
    function isValid()
    {
        $file = $this->getCachedFileContent();
        if ( $file != false )
        {
            $source = file( $this->CacheDir() . $this->FileName() );

            if ( trim ( $source[0] ) < time() )
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
   
    function getCachedFileContent( $echoString = false )
    {
        if ( $this->Exists() )
        {
            $source = file( $this->CacheDir() . $this->FileName() );
            unset($source[0]);
           
            if ( $echoString == true )
            {
                foreach($source AS $line)
                {
                    echo $line. "\n";
                }
                return true;
   
            }
            else
            {
                $line = '';
                foreach($source AS $line)
                {
                    $return_line .= $line. "\n";
                }
                return $return_line;
            }
        }
        else
        {
            return false;
        }   
    }
   
    function startCacheContentBlok( $name = '' )
    {
        ob_start(gz_handler);
    }
   
    function endCacheContentBlok( $name = '' )
    {
        $printOut = ob_get_contents();
        ob_end_flush();
        return $printOut;
    }
   
    function CacheDir()
    {
        if ( !substr( $this->CacheDir, -1 ) == "/" )
        {
            $this->CacheDir .= "/";
        }
        return $this->CacheDir;
    }
   
    function setCacheDir( $value )
    {
        return $this->CacheDir;
    }
   
    function FileName()
    {
        return $this->FileName;
    }
   
    function setFileName( $value )
    {
        $this->FileName = $value;
    }
}
?>
Avatar billede codebase Praktikant
06. januar 2004 - 09:29 #7
1. Include filen
Rundet om din sql select kan du benytte følgen kode til at cache output til en fil.

Du skal oprette et bib. kaldet cache i dit document root.
(eks. /var/www/website1/cache)
Dette bib. skal apache brugeren kunne skrive til.(chmod eller chown)

include_once( "cacheobj.php" );
$cacheobj = new cacheObj();
$cacheobj->setFileName( 'index_link-list.php' );
$cacheobj->setPeriode( 7200 );
$content = $cacheobj->getCachedFileContent( false );

if ( !$cacheobj->Exists() || $cacheobj->isValid() != true )
{
    $cacheobj->startCacheContentBlok();

    SQL SELECT OSV..

    $printOut = $cacheobj->endCacheContentBlok();
    $cacheobj->CachedFileContent( $printOut );
}
else
{
    echo $content;
}
Avatar billede codebase Praktikant
06. januar 2004 - 09:29 #8
og så lige svaret...
Avatar billede Slettet bruger
06. januar 2004 - 12:10 #9
codebase, kan du forklare mig hvad din multi cache gør? Gemmer den blot SQL genereret indhold i en fil, og bruger filen hvis der er gået mindre end 2 timer siden den sidst blev skabt?
Avatar billede codebase Praktikant
06. januar 2004 - 12:37 #10
ja den gemmer alt html output i en cached fil, i den valgte periode.
Avatar billede codebase Praktikant
06. januar 2004 - 12:37 #11
leg lidt med det på en test side, så vil du se hvor smart det er.
Avatar billede Slettet bruger
06. januar 2004 - 12:47 #12
Men hvad så hvis indholdet har ændret sig i den valgte periode?
Avatar billede codebase Praktikant
06. januar 2004 - 13:15 #13
ja, så er resultatet cached.

du kunne evt udbygge funktion så de cached sider bliver slettet, nå der opdateres.

men men side med meget load, kan vel godt caches i en periode. måske kun 10-30 min.
Avatar billede Slettet bruger
06. januar 2004 - 13:32 #14
ja ok... problemet er bare, at mine sider opdateres tit... et par gange i minuttet
Avatar billede codebase Praktikant
06. januar 2004 - 14:45 #15
du kan jo cache områder af siden! så de mest belastet sql kald minimeres.
Avatar billede Slettet bruger
06. januar 2004 - 15:34 #16
tja
Avatar billede learner Praktikant
26. november 2006 - 21:08 #17
fuck mand :o)
Jeg synes da det er megagodt script :o)
tak fra mig ihvertfald
Avatar billede codebase Praktikant
01. december 2006 - 22:33 #18
np... :)
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