Espace membres

Bonjour Anonyme

Inscription

Email :
Mot de passe :

Mot de passe oublié ?

Nos scripts

MySpeach

MySpeach est un chat php sans base de donnée, rapide, léger et facile à prendre en main. DEMO

MyPHPUpload

MyPHPUpload est un script d'upload sécurisé écrit en PHP. DEMO

GrapAgenda

Agenda PHP et MySQL avec comptes utilisateurs et administration. DEMO

Livre PHP

création de site

Stockage de données et cache avec APC

Cours / tutoriel écrit le 27-10-2010 par sky
Stockage de données et cache avec APC en PHP

APC est une extension d'amélioration des performances
Il ne doit pas être confondue avec une pilule magique, même si elle semble avoir un impac positif sur la performance!
Configuré de façon incorrecte, APC peut entraîner des comportements inattendus, mais bien optimisé APC peut être une arme utile dans votre arsenal.
Nous allons voir ici l'usage simple d'APC comme cache de données.

Stockage de données avec APC
Via les fonctions apc_add / apc_store, APC permet de gérer un système de cache utilisateur.
Cela signifie essentiellement que nous pouvons placer les valeurs d'une variable dans APC, un peux comme des systèmes tels que memcached.
Même si APC peut être très utile, surtout dans un système sans autre mécanisme de cache, méfiez-vous des limites de la mémoire de l'APC (32mo par défaut) et rappelez-vous que les données utilisateur stockées dans le cache sont au même endroit que le système d'opcode d'APC.

Jetons un regard sur la façon dont la valeur d'une variable est stockée :
<?php
$maPhrase = "Ceci est une phrase à strocker dans APC.";
apc_store("phrase_1", $maPhrase);
?>
Le premier paramètre à la fonction apc_store () est la clé.
La fonction md5() pourrais nous être utile ici pour créer des clés uniques.

Pour récupérer des valeurs enregistrées :
<?php
echo apc_fetch("phrase_1");
?>

Il serai tout de même préférable de tester l'existance de l'item en cache avant de l'utiliser et dans le cas contraire, effectuer l'opération de stockage :
<?php
if (($maPhrase = apc_fetch('phrase_1')) === false)
{
        $maPhrase = "Ceci est une phrase à strocker dans APC.";
        apc_store('phrase_1', $maPhrase, 120);
}
echo $maPhrase;
?>


Avantages de la mise en cache de données utilisateur
Bien que la mise en cache de données utilisateur est souvent perçu comme un objectif secondaire d'APC, il n'en est pas moins très utile pour certain type de données.
APC est plus rapide qu'un cache hébergé sur un autre serveur qui doit être atteint via une connexion socket.
La taille globale de la mémoire cache est toutefois relativement faible.
En raison de ces caractéristiques, données qui peuvent profiter pleinement des avantages d'APC devrait être relativement faible, souvent utilisé sur un court laps de temps, et prendre beaucoup de temps à générer.
On pourrais prendre comme exemple un système de gestion des droits d'accès (ACL).

Si cette liste est stockée dans une base de données, voici un exemple :
<?php
function getResourceList()
{
        $conn = mysql_connect("localhost", USERNAME, PASSWORD);

        if (!$conn) {
                echo "Unable to connect to database server";
                exit;
        }

        if (!mysql_select_db("sample_db") ) {
                echo "Unable to connect to database";
                exit;
        }

        $result = mysql_query("SELECT resource_id FROM acl WHERE role_id = 1 ORDER BY resource_id ASC");

        $resourceList = array();

        if (!$result)
        {
                echo "Unable to retrieve resource list";
        }
        else
        {
                while ($row = mysql_fetch_array($result))
                {
                        $resourceList[] = (int) $row["resource_id"];
                }
        }

        return $resourceList;
}
 
$resourceList = getResourceList();
?>

Comme il est probable que nous allons avoir besoin de cette liste de ressources très souvent, nous pouvons la mettre en cache dans APC afin d'améliorer la vitesse d'exécution, évitant ainsi d'aller la chercher à chaque chargement de page.

Voici un exemple d'utilisation :
<?php
if (($resourceList = apc_fetch('resource_list')) === false) {
    $resourceList = getResourceList();
    apc_store('resource_list', serialize($resourceList), 120);
} else {
    $resourceList = unserialize($resourceList);
}
?>

Nous allons ici avoir un temps d'exécution légèrement supérieur la première fois, mais quasiment immédiate pour les appels qui suivrons.


Ceci est en partie une traduction de cet article de Vito Chin que vous pouvez lire en anglais ici : http://techportal.ibuildings.com/2010/10/07/understanding-apc/

Commentaires

Aucun commentaire. Soyez le premier !

Pseudo
Email
Commentaire

Merci d'écrire le code ici :