(Classe en version alpha sur SVN)
Principe
A l'inverse de beaucoup de langages, PHP en tant que module Apache ne permet pas de garder un objet persistant partagé sur le serveur et ce pour qu'il soit partagé par toutes les instances. Cette limitation vient du fait qu'il n'y a pas de processus rémanent, un processus est créé puis fermé pour chaque client.
Copix permet toutes fois de partager des données entre les processus via la classe CopixSharedObject. Cet objet singleton récupère les données stockées sur le serveur et vous permet de les modifier. Il n'y a rien à faire d'autre que de récupérer l'objet, modifier une valeur et/ou lire des données. Tout est synchronisé en temps réel. Cela veut dire que chaque fois que vous lisez ou modifiez une valeur, les autres processus PHP/Copix peuvent accéder à la modification de l'objet.
Pourquoi pas un cache simple ou la session ou même la base de données
La session n'est valable que pour un seul client. Les valeurs ne sont pas partagés. De plus, si la session est perdu, les valeurs ne sont pas récupérables.
La base de données demande une connexion à celle-ci, une table précise. Elle demande donc une installation de serveur de base de données. Elle est utilisée pour garder des volumes de données important, n'est jamais supprimée (en théorie) par l'administrateur, et elle permet des recherches et des classements très fiables via des requêtes SQL.
En cache, le processus est plus long et il n'y a pas de synchronisation. Attention tout de même, les caches sont beaucoup plus adaptés pour garder de gors objets. L'objet de persistance est a utiliser dans des cas bien précis avec des données légères. L'objet de persistance ne doit absolument pas être utilisé pour garder des données. Utilisez plutôt les bases de données. Gardez en tête que l'administrateur du serveur peut à tout moment vouloir réinitialiser l'objet de persistance en cas de besoin.
L'intérêt de l'objet de persistance est de ne pas utiliser un serveur de base de données, pouvoir partager une objet entre des clients et surtout de se synchroniser à chaque accès/modification.
Utilisation
Récupération de l'objet:
$persistance = CopixSharedObject::instance();
Par défaut, le namespace utilisé est "default". Vous pouvez spécifier un autre namespace de cette façon:
//utilisation du namespace foo
$persistance = CopixSharedObject::instance("foo");
$persistance est un objet simple, vous pouvez lire et modifier/ajouter des valeurs.
Par exemple
A partir du moment où l'utilisateur a été ajouté dans le tableau, toutes les instances copix, y compris si elles sont en cours d'exécution, ont accès à la modification. L'objet est partagé.
Si pendant le processus un utilisateur a été ajouté via une autre instance, même après la récupération de l'objet, elle sera accessible sans pour autant écraser votre tableau.
Voici ce qu'il se passe pour un exemple de verrou de fichier:
$p = CopixSharedObject::instance("filelocker");
$file = "/tmp/monfichier";
do{
//attente que le lock soit ouvert par une autre instance
if(isset($p->filelock[$file])) sleep (0.1);
}while (isset($p->filelock[$file]));
//quelqu'un a relaché le lock, à moi de le locker:
$p->filelock[$file] = 1;
//j'écris le fichier
CopixFile::write("hello",$file);
//et je délock
unset $p->filelock[$file];
Admettons que Client B arrive pratiquement en même temps que Client A, mais avec un léger retard:
| Client A | Client B |
|---|---|
| get instance | - retard d'une instruction env. - |
| isset $p->filelock[$file] FALSE | get instance |
| $p->filelock[$file] = 1 | isset $p->filelock[$file] == TRUE --> sleep |
| ecrit le fichier | isset $p->filelock[$file] == TRUE --> sleep |
| ecrit le fichier | isset $p->filelock[$file] == TRUE --> sleep |
| ecrit le fichier | isset $p->filelock[$file] == TRUE --> sleep |
| unset($p->filelock[$file]) | isset $p->filelock[$file] == FALSE |
| fin | $p->filelock[$file] = 1 |
| ecrit fichier | |
| ecrit fichier | |
| unset($p->filelock[$file]) | |
| fin |
Conseil
Gardez en tête de ne jamais surcharger de données l'objet de persistance, Il ne doit pas être utilisé comme un cache ou une base de donnée, mais simplement servir à partager des valeurs.
Astuce pour accélérer les accès à l'objet de persistance
Sur Unix/Linux, si vous avez accès au serveur en mode administrateur (root), vous pouvez monter en TMPFS le répertoire temp/persistance de cette manière:
su -
(mot de passe root)
rm -rf /path/to/copix/temp/persistance/*
mount -t tmpfs tmpfs /path/to/copix/temp/persistance
#vérifiez:
mount | grep tmpfs
L'intérêt de cette méthode est que ce répertoire ne sera plus sur le disque dur mais dans la mémoire vive du serveur. Vous allez donc accéder à la persistance directement en RAM.

