WEB-d

Développement Web : PHP, (x)HTML, Javascript, Mootools, CSS, SEO, CMS, e-commerce, Linux, Ubuntu, ...

WEB-d Développement Web

Articles suivants »

Générer et diffuser un flux RSS

Il existe de nombreuses librairies PHP pour lire et utiliser un flux (feed) RSS sur son site web. Il en existe cependant beaucoup moins qui permettent de créer un fichier RSS correct à partir d'une série d'articles ou de news. La plupart des solutions que l'on trouve sur internet consistent à écrire manuellement le code XML correspondant. Ce n'est pas pratique, et mène souvent à des erreurs...

PHP Universal Feed Generator

Il existe heureusement une bonne librairie pour créer un flux RSS : le PHP Universal Feed Generator. Comme on peut le voir sur l'exemple ci-dessous, l'utilisation en est très simple:


require_once "FeedWriter.php";
require_once "FeedItem.php";

$feed = new FeedWriter();
$feed->setTitle('Titre de mon flux');
$feed->setLink('Adresse de mon flux.xml');
$feed->setDescription('Description de mon flux');

// $posts contient tous les articles à ajouter au flux
foreach ($posts as $post) {
    // Pour chaque article, on crée un élément
    $newItem = new FeedItem();
    $newItem->setTitle($post->title);
    $newItem->setLink($post->url);
    $newItem->setDate($post->time_published);
    $newItem->setDescription($post->content);

    // Et on ajoute l'élément au flux...
    $feed->addItem($newItem);
}
$feed->genarateFeed();
 

La version actuelle du fichier FeedWriter.php comporte cependant 2 petits bugs qu'il vous faudra corriger:

  • ligne 41, dans CDATAEncoding, il faut ajouter 'title' et 'link', sinon les caractères accentués présents dans les titres ou les liens ne seront pas correctement encodés ;
  • à la fin du fichier, supprimer la fonction __autoload car votre application possède probablement déjà sa propre fonction __autoload.

Les clients RSS génèrent énormément de trafic car ils vérifient le flux toutes les 30 min environ. Il faudra donc impérativement prévoir un système de cache, pour éviter de recréer entièrement le flux à chaque requête.

Feedburner

Feedburner

Pour réduire le nombre de requêtes, il est également possible d'utiliser Feedburner. Celui-ci va copier votre flux toutes les 30 min, et vous permet d'ajouter sur votre site un lien vers leur copie du flux, réduisant d'autant le trafic sur votre propre serveur. Il offre également d'autres avantages:

  • il compte le nombre d'utilisateurs qui suivent votre flux et vous offre des statistiques détaillées;
  • il permet aux utilisateurs de recevoir nos nouveaux posts par email;
  • il peut publier automatiquement vos nouveaux posts sur Twitter.

Sur votre compte Twitter, il existe également une option qui publie directement vos tweets sur votre page Facebook. Il suffit donc de publier une nouveauté sur site ou blog pour qu'elle se propage automatiquement à Twitter et Facebook!

Découverte automatique

Certains navigateurs, ou certaines extensions, comme RSS Subscription Extension pour Chrome affichent automatiquement une icone dans la barre de navigation lorsqu'un flux RSS est présent dans la page.

Crhome RSS Subscription Extension

Pour indiquer qu'un flux existe, il faut ajouter le lien suivant dans la section "head" de la page:


<link rel="alternate" type="application/rss+xml" title="Mon site.com" href="http://www.mon-site.com/rss.xml" />

Charger la suite de la page avec Mootools ScrollSpy

Un des effets intéressants de Facebook est le fait de charger automatiquement les histoires suivantes lorsque l'utilisateur arrive en bas de la page. Il est possible d'obtenir le même effet grâce à Mootools et ScrollSpy.

Dans le code HTML de la page, il suffit d'inclure mootools-core et scrollspy. Il faut aussi prévoir un conteneur (div id="container" dans l'exemple ci-dessous) dans lequel on viendra insérer le contenu supplémentaire:


<head>
  <script type="text/javascript" src="mootools-core.js"></script>
  <script type="text/javascript" src="ScrollSpy-yui-compressed.js"></script>
</head>

<body>
  <div id="container">
    <h2>Page 1</h2>
    <p>Lorem ipsum...</p>
  </div>
</body>
 

La classe ScrollSpy comporte plusieurs options. Celles qui nous intéressent sont "min" et "max". Elles définissent une zone. Lorsque l'utilisateur entre dans cette zone, l’évènement "onEnter" est déclenché.

Dans l'exemple ci-dessous, cette zone commence à 100px du bas de la page et s'étend jusqu'en bas. Lorsque l'utilisateur entre dans cette zone, on exécute la requête AJAX "request".

Cette "request" est une requête AJAX classique (GET ?page=2). Le code html renvoyé par le serveur sera ajouté à la fin de notre div id="container" (paramètre append). Lorsque la requête AJAX est terminée (onComplete), on va également incrémenter la variable "page", pour que la prochaine requête AJAX aille chercher la page suivante, et on va mettre à jour les paramètres min et max du ScrollSpy car la taille de la page a changé à cause du nouveau contenu.


window.addEvent('domready',function() {
  var page = 2;

  var spy = new ScrollSpy({
    min: window.getScrollSize().y - window.getSize().y - 100,
    max: window.getScrollSize().y - window.getSize().y,
    onEnter: function() {
      request.get({'page': page});
    }
  });

  var request = new Request.HTML({
    append: 'container',
    onComplete: function(){
      page += 1;
      spy.options.min = window.getScrollSize().y - window.getSize().y - 100;
      spy.max = window.getScrollSize().y - window.getSize().y;
    }
  });
});

Finalement, il reste à créer le code PHP qui va générer le contenu demandé. En voici un exemple:


if (isset($_SERVER["HTTP_X_REQUESTED_WITH"])
  AND $_SERVER["HTTP_X_REQUESTED_WITH"]== "XMLHttpRequest") {

  echo "<h2>Page {$_GET['page']}</h2>" .
    "<p>Lorem ipsum...</p>" .
    "<p>Lorem ipsum...</p>";

  exit();
}
 

Attention qu'avec cette technique, le pied de la page ne sera plus visible (sauf si l'utilisateur atteint la dernière page). Il faudra donc peut-être adapter le layout de la page...

Accélérer PHP avec APC

Lors de l'exécution d'un script PHP, le code source du ou des fichiers PHP est d'abord compilé en bytecode (appelé opcode) avant d'être exécuté. Cette phase est naturellement lourde en calculs et nécessite de lire chaque fichier sur le disque dur.

Alternative PHP Cache (APC) est une extension PHP qui optimise cet opcode, puis le met en cache, afin d'accélérer l'exécution des applications PHP. Il existe également d'autres accélérateurs PHP, mais APC est de loin le plus utilisé.

L'installation sur Ubuntu est très simple:


sudo apt-get install php-apc
sudo /etc/init.d/apache restart

Un script PHP est également fourni qui permet de contrôler le fonctionnement de APC. Pour l'utiliser, il faut le copier dans l'arborescence du site web, puis de modifier le mot de passe par défaut (normalement à la ligne 42):


sudo cp /usr/share/doc/php-apc/apc.php.gz /var/www/default
sudo gzip -d /var/www/default/apc.php.gz
sudo nano /var/www/default/apc.php

La page web est alors accessible à l'adresse http://www.mon-server.com/apc.php

APC

La configuration de APC se fait dans le fichier /etc/php5/apache2/conf.d/apc.ini. Les paramètres par défaut sont relativement bon, mais on peut légèrement les optimiser:

  • Augmenter la quantité de mémoire allouée au cache (paramètre apc.shm_size). Une bonne valeur de départ correspond à la taille de la mémoire RAM du serveur divisée par 16 (donc 256 pour 4Go de RAM);
  • Activer le paramètre apc.lazy_classes.

D'autres paramètres existent également. La liste complète est disponible sur la page de configuration de APC. Voici un exemple de fichier /etc/php5/apache2/conf.d/apc.ini :


extension=apc.so
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 256
apc.lazy_classes = 1

Après avoir modifié le fichier, il faut redémarrer Apache, et surtout vérifier que celui-ci a démarré correctement:


sudo /etc/init.d/apache restart
sudo tail /var/log/apache/error.log

Système de fichier distribué GlusterFS

Logo GlusterFS

GlusterFS est un système de fichier distribué. Les fichiers sont stockés sur un cluster de serveurs reliés par une réseau local Ethernet ou InfiniBand. Les clients peuvent utiliser le système de fichier simplement avec la commande mount, comme pour n'importe quel système de fichier.

GlusterFS n'utilise pas de serveur central pour le stockage des metadata (sur quel serveur est situé quel fichier, etc.). Il n'y as donc pas de "central point of failure" ni de "bottleneck", ce qui permet d'utiliser GlusterFS pour des volumes jusqu'à plusieurs pétabytes. En contrepartie, les clients doivent absolument utiliser un fichier de configuration qui correspond exactement à l'architecture du cluster, sous peine de corrompre le système de fichier. Tous les clients doivent naturellement utiliser le même fichier de configuration.

Les serveurs

L'installation du serveur sur Ubuntu est très simple:

sudo apt-get install glusterfs-server

GlusterFS fonctionne grâce à des "translators" qui prennent en charge différentes fonctionnalités. Le fichier de configuration d'un server liste donc plusieurs "translators" afin d'obtenir la comportement désiré. Ce fonctionnement rend la configuration relativement complexe. Heureusement GlusterFS est fourni avec l'outil glusterfs-volgen qui permet de créer directement un fichier de configuration "de base" pour les cas les plus courants.

Pour l'exemple, imaginons une configuration avec 2 serveurs (192.168.1.10 et .11) qui stockent les données dans /var/glusterfs/store1. La commande correspondante sera:

glusterfs-volgen -n store1 192.168.1.10:/var/glusterfs/store1 192.168.1.11:/var/glusterfs/store1

glusterfs-volgen crée alors 3 fichiers: 1 pour chaque serveur, et 1 pour les clients. Il suffit alors de transférer les fichiers sur les serveurs respectifs, de les copier vers /etc/glusterfs/glusterfsd.vol et de redémarrer le serveur:


sudo mkdir -p /var/glusterfs/store1
sudo cp 192.168.1.10-store1-export.vol /etc/glusterfs/glusterfsd.vol
sudo /etc/init.d/glusterfs-server restart

Réplication

Par défaut, les fichiers sont simplement distribués entre les différents serveurs. Les fichiers ne sont donc pas protégés en cas de crash et il vaut donc mieux prévoir un système de backups ou un système RAID 1 ou RAID 5 afin de se protéger contre la perte de données.

GlusterFS avec distribution et réplication des fichiers sur 4 serveurs

Ou alors, il est également possible de configurer GlusterFS pour répliquer ET distribuer les fichiers au sein du cluster, comme sur la figure ci-dessus. Pour cela il suffit d'ajouter le paramètre --raid=1 à la commande glusterfs-volgen:

glusterfs-volgen -n store1 --raid=1 192.168.1.10:/var/glusterfs/store1 ...

Les clients

L'installation du client est également très simple:

sudo apt-get install glusterfs-client

Une fois le fichier de configuration store1-tcp.vol transféré vers le client (par exemple vers /etc/glusterfs/store1-tcp.vol), il suffit alors de monter le volume:


sudo mkdir /mnt/store1
sudo mount -t glusterfs /etc/glusterfs/store1-tcp.vol /mnt/store1

Pour que le client "monte" automatiquement le volume au démarrage, il faut ajouter la ligne suivante dans /etc/fstab:

/etc/glusterfs/store1-tcp.vol  /mnt/store1  glusterfs  defaults  0  0

Microformats et hCard

L'idée des microformats consiste à ajouter des informations (meta data) au code html afin de le rendre plus facilement compréhensible, et donc utilisable, par un robot. Les microformats sont donc de plus en plus utilisés par les moteurs de recherche pour "comprendre" les pages web.

Le microformat le plus utilisé actuellement est le hCard, qui sert à publier les détails de contact (adresse, numéro de téléphone, adresse email...) d'une personne ou d'une organisation. Voici un exemple complet de hCard :


<div class="vcard">
  <span class="fn">Thibault Debatty</span><br/>
  <span class="tel">+32 (0) 123 45 67 89</span><br/>
  <a class="email" href="mailto:info@web-d.be">info@web-d.be</a><br/>
  <div class="adr">
    <span class="street-address">Avenue Milcamps</span><br/>
    <span class="postal-code">1030</span><br/>
    <span class="locality">Bruxelles</span><br/>
    <span class="country-name">Belgique</span>
  </div>
</div>
 

A ne pas oublier :

  • L'élément racine est vcard, alors que le format se nomme hCard;
  • L'élément fn est obligatoire;
  • D'autres éléments sont également disponibles (org, photo, bday...). La liste complète est disponible sur le site officiel du microformat hCard.

Pour être sûr que votre code est correct, vous pouvez utiliser un outil de validation, comme le hCard validator.

Certaines extensions pour Chrome ou Firefox permettent également d'utiliser les microformats présents dans une page web. C'est le cas de Microformats for Chrome par exemple.

Extension Microformats pour Chrome

Articles suivants »

© 2010-2012
www.web-d.be

TVA BE 0889.467.828

Thibault Debatty
+32 (0)497 45 23 16

Av. Milcamps 25; 1030 Bruxelles; Belgique