Exemple d'application d'un SharedObject en PHP

Tags:: php :: copix

Je vous l'ai annoncé il y a quelques jours, Copix intègre dés aujourd'hui un SharedObject (attention, ce n'est pas le SharedObject de FMS ou Red5) qui permet de partager des données transitoires entre différents clients. On m'a souvent demandé sur le forum de copix l'intérêt de ce genre d'objet, ou tout du moins à quoi il peut servir.

J'avais quelques exemples que j'ai donné, mais je me suis enfin retrouvé devant une application parfaite pour un SharedObject. Je travaillais sur CWE (Copix Widget Everywhere) sur lequel j'ai ajouté un onglet de partage de widget par mail. L'idée est simple, l'utilisateur entre le mail de son ami, un message, renseigne son nom, son mail... et entre un captcha. Le captcha étant généré coté serveur, je l'enregistre dans la session.

Le processus se passe de cette manière:

  • Le formulaire est créé avec un identifiant en javascript. La raison de cette méthode est que je peux avoir plusieurs formulaires sur ma page (sur netvibes, Igooge...)
  • l'image est récupérée par le navigateur avec un paramètre d'identifiant unique. De cette manière, je garde une image de captcha pour chaque formulaire. <img src="http://..../captcha?formid=12345" />

<?php
//... captcha.actiongroup.php
$captcha = new Captcha();
$code = $capthca->getCaptcha();

$captchas = CopixSession::get('captchas','CWE');
$captchas[_request('formid')] = $code ;

CopixSession::set('captcha', $captchas ,'CWE');

//...

?>
 

Lors de l'envoi du formulaire en Ajax, j'envoyais aussi le formid, il me suffisait de faire:


<?php

//...
$captchas =  CopixSession::get('captchas','CWE');

if (isset($captchas[_request('formid')]
     && $captchas[_request('formid') == _request('code'))){
   //... on est ok, le code captcha est bon...
}

//...

?>
 

Jusque là, tout fonctionnait parfaitement... mais un jour, ce fut le drame! Nous avons ajouté la possibilité de pouvoir héberger le widget sur un autre serveur ayant un autre nom de domaine. L'envois du formulaire se faisant en Ajax, j'ai créé un petit proxy PHP pour envoyer les données vers le serveur. Sauf que voilà... L'image de captcha est récupéré sur l'hôte directement par le navigateur... par contre l'envoi passe par le proxy qui est sur le serveur... ce serveur qui devient le client... et donc qui a une autre session.

C'est là que que le SharedObject entre en jeux. Lors de la génération du captcha, j'enregistre une entrée avec l'identifiant du client et son captcha. Lors de l'envoi du formulaire, l'identifiant est aussi envoyé.

Voici maintenant la méthode avec un ShareObject:


<?php
//... captcha.actiongroup.php
$captcha = new Captcha();
$code = $capthca->getCaptcha();



$so = CopixShareObject::instance('CWE');
if(!isset($so->captchas)) $so->captchas = array();

$captchas = $so->captchas;
$captchas[_request('formid')] = $code;

$so->captchas = $captchas;

?>
 

Cet objet est maintenant lisible par tous les clients, que ce soit mon proxy, mon navigateur, un autre client... l'objet est partagé. La vérification reste simple:


//...

$so = CopixSharedObject::instance('CWE');
$captchas = $so->captchas;

if (is_array($captchas)
    && isset($captchas[_request('formid')])
    &&  $captchas[_request('formid')] == _request('code') ) {
    //on est ok, on en profite pour supprimer le captcha de la mémoire
    unset($captchas[_request('formid')]);
    $so->captchas = $captchas;
}

//...
 

Notez que le simple fait de modifier une valeur du ShareObject enclenche le processus d'enregistrement. Si jamais deux formulaires sont envoyés en même temps, cela fonctionne toujours. L'objet est synchronisé, il n'y a pas de perte de données entre les clients.

Il est clair que cela demande un tout petit peu plus de code, mais la méthode de session ne peut pas marcher. Ici, seul un enregistrement en base, un cache ou SharedObject pouvait fonctionner. Et la méthode du ShareObject permet de travailler plus rapidement en terme de code.

Il faudra aussi penser à supprimer les vieilles entrées de captchas. Pour ma part, j'enregistre non plus le code mais un CopixPPO contenant le timestamp actuel et le code captcha. Au moment des vérification de code, je supprime toutes les entrées qui ont plus de 'mktime()+86400', c'est à dire une journée.

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile
1 Mercredi 28 Mai 2008 08:43:19, Gérald

Plop Metal3d,
Jeudi soir, première réunion officielle de l'association Copix.... j'espère que tu seras des notres !

2 Mercredi 28 Mai 2008 11:50:40, Meta3d

Sans aucun problème !!!
Tu oublis pas de commander des strip-teaseuses hein !

Ajouter un commentaire
Veuillez répondre à la question suivante : Tapez "clap" sans guillemets dans le champs suivant

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F77

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming Arkyne svn subversion gnome VLC Tv encoder ffmpeg Cryptage apple microsoft HTML5 Max Apple code youtube quvi git uzbl webgl chromium

  Catalogue professionnel de musique libre


  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict

tumblr visitor