PHP: Cache

Når man jobber med PHP er det ikke alltid at man trenger å kjøre tunge SQL spørringer mot databasen for hver sidevisning, da flere operasjoner henter opp den samme informasjonen. Da kan man benytte cache. Jeg opprettet meg en enkel Cache klasse, for å illustrere at det egentlig ikke er en tungvindt prosess, samtidig som man enkelt kan se hvordan cache kan benyttes.

Klassen

class Cache {
    private $Folder = 'cache/';

    public function __construct ($Folder = '') {
        if (isset($Folder) && is_dir ($Folder)) $this->Folder = $Folder;
    }

    private function file ($File) {
        return $this->Folder . sha1 ($File) . '.cached';
    }

    public function get ($File, $TTL = 600) {
        $Filepath = $this->file ($File);
        if (file_exists ($Filepath) && filemtime ($Filepath) > strtotime ('- ' . $TTL . ' seconds'))
            return unserialize (file_get_contents ($Filepath));
        return false;
    }

    public function set ($Filename, $Content) {
        $Filepath = $this->file ($Filename);
        return file_put_contents ($Filepath, serialize($Content)))
    }

    public function flush ($Filename) {
        $Filepath = $this->file ($Filename);
        if (file_exists ($Filepath))
            return unlink ($Filepath);
        return true;
    }
}

Da har man en helt enkel PHP klasse som tar for seg det grunnleggende med Cache. Kort fortalt har man metoder for å hente ut fila, lage ny fil, eller tømme cachen. Problemet til mange er å forstå hvordan man kan benytte en cache. I mitt tilfelle ønsker jeg å lagre cachen som ett array, siden jeg fortsatt skal kunne benytte informasjonen jeg henter opp ifra databasen dynamiskt, selv om at det er ifra cache. I andre tilfeller kan jeg bare lagre hele HTML koden rett i cache, for å spare enda mer datakraft, men da fjerner jeg den dynamiske delen med koden i mitt tilfelle.

En kunde ønsket en FAQ, hvor alle spørsmålene ble listet opp, gruppert etter hvilken kategori de tilhørte, men svarene skulle ikke stå før man valgte å klikke de fram, men siden det var ganske mange kategorier, spørsmål og svar, ønsket dem en cache funksjon på det.

Siden siden skulle være dynamisk for å få fram svarene, tenker man kanskje først at man må cache alle svarene i egne filer, men ved bruk av en array i cachen, trenger man bare én cache fil. Her er hvordan jeg løste det.

$Cache = new Cache;
$CacheName = 'faq';

// Her sjekker jeg opp om det finnes en cache, hvis ikke, så oppretter jeg en cache med ønsket resultat
if (!$Row = $Cache->get ($CacheName)) {
    // Det fantes ingen Cache/den var for gammel, derfor henter jeg ut informasjonen ifra databasen
    // og oppretter en ny cache fil
    $SQL = new SQL (MYSQLHOST, MYSQLUSER, MYSQLPASS, MYSQLDB);
    $Query = 'SELECT s.id AS main_id, s.name, a.id, a.title, a.content
              FROM faq_sections AS s
              INNER JOIN faq_articles AS a ON (s.id = a.section_id)
              ORDER BY a.section_id, a.id';

    $SQL->query ($Query);
    while ($Result = $SQL->fetch_assoc()) {
        $Row[] = $Result;
    }
    $Cache->set ($CacheName, $Row);
    // Debug testing
    echo '<p>LIVE FROM DATABASE</p>';
}

Nå har jeg enten informasjonen ifra cache, eller databasen, i $Row-arrayen, og kan derfor fortsette med vanlig koding under for å vise fram informasjonen jeg ønsker.

I administrasjonspanelet, kan jeg benytte $Cache->flush (‘faq’) når jeg legger inn nye spørsmål og svar, for å gi en oppdatert side til alle brukerne.

Kom gjerne med spørsmål og forslag til klassen.

Posted in blogg | Tagged | 2 Comments

Konvertere bytes om til leselige tall

Når jeg programmerer noe som har med utskriving av filer, ønsker jeg ofte å vise størrelsen på filen, da kan jeg benytte int filesize ( string $filename ), men jeg får da resultatet tilbake i bytes. Derfor benytter jeg ofte denne funksjonen for å konvertere det over til en leselig størrelse.

function byte_converter ($Filesize) {
    $Count = 0;
    $Format = array ('B', 'kB', 'MB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $CountDiff = count ($Format);
    while (($Filesize / 1024) > 1 && $Count < $CountDiff) {
        $Filesize = $Filesize/1024;
        ++$Count;
    }
    return number_format ($Filesize, 2, ',', ' ') . ' ' . $Format[$Count];
}

Håper denne lille funksjonen kan være til like stor nytte for andre, som den har vært for meg.

Posted in blogg | Tagged | Leave a comment

Siste uken min

I dag starter jeg på min siste uke på Rema 1000 Sjøgata, før jeg flytter hjem til Narvik igjen. Det er ikke noe tvil om at jeg kommer til å savne de andre ansatte som er en fantastisk positiv og morsom gjeng å jobbe sammen med, men jeg blir også å savne en god del av kundene som jeg etterhvert har begynt å slå av en liten prat med. Noe av det som har vært litt morsomt med å bo på Sortland, er at jeg blir gjenkjent som «Remafyrn» når jeg er ute, da veldig få har fått med seg hva jeg heter, men alle vet hvor jeg jobber.

Har lært mye forskjellig i min tid på Sortland, både oppsetting av kampanjevarer, bestilling av varer, utviklet meg i en positiv retning angående kundebehandling og har blitt kjent med mange hyggelige mennesker, og er absolutt en positiv erfaring som jeg blir å ta med meg videre i livet.

Posted in blogg, jobb | Tagged , , , | Leave a comment

iMac 27″

My new loveiMac 27"

Posted in blogg | Tagged , | 2 Comments

BloggCamp 2010

For fjerde gang i historien har jeg vunnet noe. Første gangen jeg vant noe var i en julekalender på Ungdomsweb, andre gangen vant jeg faktisk Nokia 6500, ifra MPX. Tredje gangen vant jeg en “Flash Gordons” plate hos Stian Andreassen (@stiaand). Nå fikk jeg nettopp gratis billetter til BloggCamp 2010, etter at Thomas Moen (@thomasmoen) re-tvitret «RT @bloggcamp: De 10 første som bruker kode “twitter” når du bestiller billett får den gratis RT!»

Da er visst ett par av feriedagene mine for neste år allerede booket, og sparing for flybilletter starter nå.

Foreløpig vet jeg at Guðrún Jóna (@gjona) skal dit, så henne må jeg hilse på. Si ifra om det er noen andre som skal dit som jeg må hilse på om ett års tid :)

Posted in blogg, freestuff | Tagged , , , , | 4 Comments

2 tips for Mac og iPhone

iDisk er noe jeg aldri har hatt behov for å bruke, da jeg kan koble meg til andre servere via Macfusion. Derfor har iDisk ikonet bare vært i veien i Finder for meg.

Finder – Valg – Sidepanel – Fjern haken på iDisk


Det andre tipset er noe som kom med OS 3.0 til iPhone. Noen liker funksjonen, andre, som meg, missliker den. Det gjelder “gjenta varsel” på mottatte meldinger hvis man ignorerer meldingen.

Innstillinger – Meldinger – Gjenta varsel

iPhone - gjenta varsel

Posted in blogg | Tagged , , , | Leave a comment

GeekTool for Mac

Jeg har tidligere drevet litt med Bash-scripting, og lærte meg en del terminal-koder jeg kunne ha nytte av videre i livet mitt. Men brukte dette bare til å lage MOTD til en VPS jeg leier. Men fant ett til nyttebruk for det nå, nemlig til GeekTool.

Oppetid

uptime | sed 's/.*up \(.*\), [0-9]* user.*/Uptime: \1/'

Resultat: Uptime 3 days, 11:07

Load

uptime | sed 's/.*averages: \(.*\)*/Load: \1/';top -l 1| awk '/CPU usage/ {print $8, $9, $10, $11, $12, $13}';'

Resultat: Load: 0.29 0.25 0.27
15.38% user, 42.31% sys, 42.31% idle

Noen som har noen flere små koder som kan være nyttige å ha på skrivebordet?

Posted in blogg | Tagged , , | Leave a comment

Gratulerer med dagen til meg selv

Da var man visst blitt ett år eldre, hele 21 år.

Posted in blogg | 1 Comment

En gang i tiden

Rart å tenke på at man en gang i tiden var liten og søt.

Emil -liten

Emil

Posted in blogg | Tagged | Leave a comment

Oppgradert RAM

RAM-picturesque

Husker den første RAM-brikken jeg kjøpte, DDR-DIMM PC2700 512MB DDR CL2,5, for 460kr. Nå får man langt kraftigere og raskere 2GB brikker, for halve prisen av hva jeg betalte for én 512MB brikke. Hva var din første RAM brikke, og finner du ut hva du betalte for den?

Posted in blogg | Tagged , | 6 Comments