Mettre des functions en Cache

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Hello,

Je recherchais un système pour mettre des functions en cache, j'ai donc fait une ptit function, si vous voulez la modifié & la partager pourquoi pas :)
Vous devez a chaque fois faire un return Cache([__function__, func_get_args()], {LE RESULTAT DE LA FONCTION});

PHP:
echo FonctionAMettreEnCache(1, 5);

function FonctionAMettreEnCache($a, $b){
    $calcul = $a + $b;
    return Cache([__function__, func_get_args()], $calcul);
}

/*
$f = Un array 
    $f[0] = le nom de la function a mettre en cache
    $f[1] = les arguments passer par la function $f[0]
    $result = le resultat de la function $f[0] ce qu'il faut mettre en cache
    $d = Nombre de seconde a mettre en cache par defaut 600 secondes

*/

function Cache($f, $result, $d = 600){ 

    $name = $f[0];
    if(is_array($f[1])){
        foreach ($f[1] as $key => $value) {
            $name .= "-".$value;
        }
    }elseif(!empty($f[1])){
        $name .= "-".$f[1];
    }
    $name = $_SERVER['DOCUMENT_ROOT']."/cache/".sha1($name).".json";
    if (file_exists($name)) {
        if(filemtime($name)+$d <= time()){
            $fichier = fopen($name, "w+");
            fwrite($fichier, json_encode($result));
            fclose($fichier);
            return json_decode(file($name)[0]);
        }else{
               return json_decode(file($name)[0]);         
           }
    }
    $fichier = fopen($name, "w+");
    fwrite($fichier, json_encode($result));
    fclose($fichier);
    return json_decode(file($name)[0]);
}
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 547
Points
24 772
Je pense que passer par un fichier n'est pas une bonne idée car tu donnes accès au résultat de toutes tes fonctions mises en cache dedans.
De plus, tu devrais utiliser la programmation orientée objet plutôt que de créer 2 fonctions dans un même fichier
Pour la mise en cache, il existe des outils plus performants et sécurisés comme redis, si ça t'intéresse je t'invite à te renseigner là dessus :p

Sinon pourquoi pas créer un truc soi-même c'est vrai mais réinventer la roue et offrir quelque chose de pas très sécurisé c'est un peu jouer avec le feu :espion:
Bonne chance pour tes projets :D
 

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Je pense que passer par un fichier n'est pas une bonne idée car tu donnes accès au résultat de toutes tes fonctions mises en cache dedans.
De plus, tu devrais utiliser la programmation orientée objet plutôt que de créer 2 fonctions dans un même fichier
Pour la mise en cache, il existe des outils plus performants et sécurisés comme redis, si ça t'intéresse je t'invite à te renseigner là dessus :p

Sinon pourquoi pas créer un truc soi-même c'est vrai mais réinventer la roue et offrir quelque chose de pas très sécurisé c'est un peu jouer avec le feu :espion:
Bonne chance pour tes projets :D

Tu n'as pas tord pour le fichier accessible, mais je l'utilise pour mon système d'API qui est en local

Créé un class juste pour une fonction ? mouais, après j'ai mis ma fonction dans ma class API qui met en cache les résultats

Pour Redis, tout dépends de l'utilisation, si tu met en cache 1 mois ? puis redis si tu as 2-4Go de ram tu peux oublier

Puis trouver la function hacher avec les arguments faut y aller x)
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 547
Points
24 772
Créé un class juste pour une fonction
Deux :p
puis redis si tu as 2-4Go de ram tu peux oublier
On utilise Redis sur notre serveur de prod sur un site e-commerce qui fait 25 million de CA, je te laisse imaginer le trafic et le volume que ça représente ; pourtant ça fonctionne très bien :p
Et c'est pas si gourmand que ça en ressources finalement...

Et l'utilisation d'une classe est un concept un peu plus séduisant car tu pourras le réutiliser sur tout type de projet (procédural ou orienté objet) sans casser le concept du projet de base (à mon humble avis) et tu pourras développer plus de méthodes intéressantes comme "isCacheExists()", des concepts comme des cacheKeys, etc :p

Après effectivement ça dépend de ton utilisation, il ne faut pas déployer un tank pour aller combattre des cambrioleurs :espion: Mais je tenais à donner mon point de vu ahah :p
 
Haut