TUTORIEL PHP 
Le cache par la pratique
Après l'accélération de code, le cache est la méthode la plus facile pour accélérer un site web existant : voici une approche pratique sans dépendance externe. (31/01/2005)
(fourni par Direction PHP)

<< 1. Introduction
2. L'anti-PEAR
3. Préparation
4. Cache en mémoire vive
5. Améliorations
6. Cache avec fichier et utilisation du cache

Améliorations
Un des problèmes principaux de l'extension shm que j'ai présenté au listing 2 est que toutes les opérations sont traitées sur un pied d'égalité : le système verrouille le sémaphore pour n'autoriser qu'une seule opération à un moment donné, sans faire de distinction entre les lectures et les écritures.

La vérité est que nous pourrions autoriser plusieurs processus à lire la mémoire simultanément, car ces opérations ne sont pas exclusives. Ce n'est que lorsque la mémoire doit être écrite que nous devons bloquer l'accès aux autres processus.

Notez que la nature des lectures est telle qu'elles sont très rapides, puisqu'il suffit d'extraire les données dans un segment de mémoire vive. Par conséquent, il n'y a pas besoin de méthode de synchronisation.

Cependant, si vous voulez en ajouter une, il faut être très prudent pour ne pas donner la priorité aux lectures sur les écritures : c'est une erreur courante et très coûteuse. Prenons un exemple. Considérez le mécanisme de stockage suivant :

concurrency = 0
semaphore read_sem
semaphore write_sem

read:

do true
  acquire (read_sem)
  concurrency++
  if (concurrency = 1)
    acquire (write_sem)
  fi
  release (read_sem)

  [Lecture de la mémoire ici]

  acquire (read_sem)
  concurrency
  if (concurrency = 0)
    release (write_sem)
  fi
od

write:

do true
  acquire (sem_write)

  [Ecriture de la mémoire ici]

  release (sem_write)
od


C'est une solution classique où le problème des écritures et des lectures causera un problème majeur en environnement Web. Le cœur de l'algorithme est le sémaphore "write" qui ne peut être posé que lorsqu'il n'existe aucune opération d'écriture en attente. D'un autre côté, les opérations de lecture simultanées peuvent être menées sans poser de verrou, avec un net gain d'efficacité. En théorie, vous aurez aussi besoin d'un autre sémaphore et d'un stockage global où la variable $concurrency sera stocké, et dans notre cas, cela annule tous les autres avantages.

  Forum

Réagissez dans les forums de JDN Développeurs

Le vrai problème ici est que cet algorithme favorise les lectures par rapport aux écritures. Tant qu'il y a une lecture en cours, une autre lecture peut survenir et passer en priorité sur une écriture. Dans un environnement Web, notamment si le trafic est très fort, les opérations de lectures sont très fréquentes, et elles vont retarder les écritures. Il suffit que deux lectures se chevauchent suffisamment souvent pour que les écritures soient carrément interdites.

<< 1. Introduction
2. L'anti-PEAR
3. Préparation
4. Cache en mémoire vive
5. Améliorations
6. Cache avec fichier et utilisation du cache

 

 
Rédaction JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages