Hoi,

Ik heb momenteel een get() functie in m'n cache class en die ziet er zo uit:

<?php

class FileCache implements CacheInterface
{
  public function get($key)
    {
        $path = $this->getFullPath($key);

        if (!file_exists($path)) {
            throw new Exception\CacheFileNotFoundException($path);
        }

        $file = unserialize(file_get_contents($path));

        if (($file['lifetime'] - time()) < 0) {
            $this->remove($key);
        }

        return $file['data'];
    }
}

?>


Zoals je kan zien remove ik het cache bestand als de lifetime verlopen is. Nu mijn vraag: is het niet beter dat ik nét na die remove een exception gooi?
Of moet ik het zo laten en is de PHP error die je krijgt bij het returnen van de cache data genoeg?

Raoul
Waarom zou je een exception gooien nadat je het bestand hebt verwijderd? Welk doel dient dat?

Ook zie ik het nut van die andere exception niet. Dit zegt zoveel als 'cache hoort er altijd te zijn' en dat is pertinent niet zo. Als er geen cache aanwezig is betekent het gewoon dat je de data op dat moment zult moeten genereren. Dat lijkt mij een normale omstandigheid en geen fout.
@Erwin: Thanks. Daar ben ik het niet mee eens. Cache hoort er idd altijd te zijn, maar je moet het zelf aanmaken.
Voor je iets ophaalt moet je zeker zijn dat het cache bestand bestaat, en zo niet, zelf aanmaken. Zo zie ik het echter.

En ik wil een exception gooien omdat de programmeur dan een bericht krijgt dat het bestand is verlopen... of moet 'ie dat zelf weten op basis van de lifetime? Ik weet het niet.

Raoul
Cache hoort er niet altijd te zijn. Als cache er altijd zou zijn ben je gewoon een duplicaat van je database aan het bouwen. Cache hoort er alleen te zijn voor gegevens die ofwel teveel tijd kosten om 'on-the-fly' aan te maken, ofwel voor redelijk statische data die veel aangevraagd wordt. Voor de rest heb je geen cache nodig.

Daardoor hoor je te kijken of er cache is (en nog gebruikt kan worden). Zo ja, gebruiken, zo nee, zelf nieuwe data aanmaken. Ik zie echt geen enkele noodzaak om een exception te gooien.
Het laatste punt dat je geeft is neem ik aan een losse omschrijving van dat het script ziet dat er geen cache is (niet de programmeur). Daar heb je echter geen exception voor nodig. Daarvoor kan je ook gewoon 'false' terugsturen, of een lege string. Dan weet het script ook dat er dus geen cache was. Hoewel je exceptions kunt gebruiken voor control structures, is het wat mij betreft geen juiste manier. Een exception gooien geeft eigenlijk aan dat er iets fout is en dat is in dit geval in mijn ogen niet het geval.
Dat zeg ik toch? Daarom dat ik het ook zo ingesteld heb om een lifetime in te stellen.

En als je gewoon false teruggeeft dan kan er toch vanalles mis gegaan zijn? Bestand kon niet geopend worden, bastand is verlopen, bestand bestaat niet, ...?
Nee dat zeg je niet. Jij zegt dat er altijd cache hoort te zijn en als het er niet is dat het 'fout' is. Ik zeg dat je als er cache is die moet gebruiken, als het er niet is maak je de data op dat moment aan. Daar zit een groot verschil tussen.

- Raoul - op 20/02/2013 14:51:01
En als je gewoon false teruggeeft dan kan er toch vanalles mis gegaan zijn? Bestand kon niet geopend worden, bastand is verlopen, bestand bestaat niet, ...?

En het resultaat is allemaal hetzelfde, er is geen data om de pagina mee op te bouwen, dus je moet het opnieuw laten genereren. De rest van je script heeft er geen bal mee te maken waarom de data er niet is. Het is er gewoon niet.

Waar je, bij een deel van je opsomming, wel iets moet doen is in de cache omgeving zelf. Die zou wat mij betreft autonoom moeten zijn en bijvoorbeeld bij het vinden van een corrupt bestand dit moeten loggen. Zo kan de beheerder later wel zien dat er een probleem was. Alleen hoeft dit totaal niet naar de rest van de applicatie gestuurd te worden, die kan er toch niets mee.
Raoul, Erwin heeft gelijk.

Caching doe je om performancewinst te behalen. Op het moment dat een cache bestand niet aanweizg is, dan moet de code het cachebestand aanmaken! Je moet daar dus inderdaad niet met exceptions gaan gooien.

Schematisch:

- kijk of er een cachebestand is
- ja: lees het cachebestand in en gebruik de gegevens uit het cachebestand
- nee: haal de gegevens uit de database en maak een nieuw cachebestand aan

Snap je?

[size=xsmall]Toevoeging op 20/02/2013 15:00:29:[/size]

(@Erwin, hoe detecteer je een corrupt bestand?)
Ja ok... maar als het script zélf een cache bestand aanmaakt, dan is het bestand toch gewoon leeg? Dan kan ik toch evengoed gewoon null returnen?
@Ozzie, als het wel bestaat, maar je het niet kunt lezen? Of anders een bestand dat zou moeten bestaan dat niet bestaat, of dat leeg is, of....
Punt hierbij, de cache omgeving kan dit soort fouten best loggen, maar gewoon niet doorgeven aan de rest van de applicatie.
- Raoul - op 20/02/2013 15:03:50

Ja ok... maar als het script zélf een cache bestand aanmaakt, dan is het bestand toch gewoon leeg? Dan kan ik toch evengoed gewoon null returnen?

Je retourneert false waardoor je script weet dat er geen cache bestand is (en het dus opnieuw moet worden aangemaakt). Je kunt overigens ook voor een andere opzet kiezen, dat er altijd een cachebestand aanwezig is (waar noodzakelijk) en dat ergens anders in je script ervoor wordt gezorgd dat het wordt aangemaakt.

@Erwin: oké.

Reageren