Vous avez développé votre tout dernier web service destinés à être utilisé par 2 ou 3 autres équipes en interne (voire en externe par des partenaires).

Il (le web service) fonctionne bien, tellement bien, que vous commencez à avoir plusieurs dizaines de requêtes par jour.

Vous n'aviez pas forcément optimisé les performances du web service, les temps de réponses ne sont pas au beau fixe car vous chargez 150 classes PHP qui sont nécessaires au tout dernier framework à la mode pour accéder à une table de base de données et faire une requête select sur un champ avec une clé primaire pour retourner la fiche descriptive d'un utilisateur, d'un partenaire ou d'un produit. Ou bien, pire encore, pour renvoyez votre catalogue de produits qui fait 150Ko une fois transformé au format XML.

Vous êtes vous posé la question suivante :

A quelle fréquence mes données changent-elles ?

En effet, à quoi cela vous sert-il de générer par une logique complexe un export (xml, json, text, soap...) de vos données si elles ne changent pas à la même fréquence que les requêtes qui vous parviennent ?

De façon plus optimale, vous pourriez générer une première fois cet export, la première fois qu'il vous est demandé par exemple, et le mettre en cache dans un fichier. Ce fichier pourrait alors être servi pour toutes les requêtes successives, et ce jusqu'à temps que vos données ne changent (en base de données par exemple), vous auriez alors à supprimer le fichier de cache et faire en sorte que votre application le détecte et le régénère à la demande.

Comment faire ?

Si vous utilisez Apache, vous pouvez mettre en oeuvre l'url rewriting en créant un fichier .htaccess à la racine publique de votre application en y mettant, par exemple :

...
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule ^/mon-webservice/(.*).xml monwebservice.php?id=$1
...

Ainsi, Si un utilisateur requête /mon-webservice/voitures/peugeots.xml, Apache commencera par vérifier si le fichier 'mon-webservice/voitures/peugeots.xml' existe sur le disque dur (dans votre DocumentRoot) et si c'est le cas, il le renverra directement sans passer par aucun script PHP. Si le fichier n'existe pas, alors votre script 'monwebservice.php' sera appelé et sera chargé de renvoyer le contenu.

Vous pourriez alors avoir dans monwebservice.php un code similaire à celui-ci :


ob_start();

// votre logique ici
// ...

$xml = ob_get_contents();
ob_end_clean();

file_put_contents(dirname(__FILE__)."/mon-webservice/$id.xml",$xml);

header('Content-Type: text/xml');
echo $xml;

Ainsi, à chaque fois qu'il sera appelé, votre script générera le xml, l'écrira dans un fichier sur le disque (le fichier de cache visible dans votre DocumentRoot) et renverra le contenu XML au navigateur.

Dernière étape, il vous reste maintenant à supprimer le fichier de cache lorsque celui-ci devient obsolète, par exemple quand les données en base de données changent ou bien que certaines données temporelles ou calculées doivent être mises à jour. Dans le premier cas, la mise à jour de la base de données se fait en règle général par l'intermédiaire d'un autre de vos script (par exemple /admin/index.php), il suffit d'include dans ce script la ligne suivante :

...
unlink(dirname(__FILE__).'/../mon-webservice/voitures/peugeot.xml');
...

Si vous ne maîtrisez pas la mise à jour de la base de données ou que le cache devient obsolète à cause de données temporelles, songez à proposer un script déclenchable à distance (par un cron ou bien pas l'application mettant à jour la base de données) qui supprimerait les fichiers de cache incriminés.