Je travaille depuis un certain temps récemment sur l'optimisation des performances du programme et j'ai une idée intéressante que j'aimerais partager avec vous.
Le cache est un mode d'application typique de la stratégie « espace-temps » et une méthode importante pour améliorer les performances du système. L'utilisation du cache peut réduire considérablement le nombre d'opérations de base de données dans le cas de volumes d'accès importants, réduisant ainsi considérablement la charge du système et améliorant ses performances. Par rapport à la mise en cache des pages, l'ensemble de résultats est une sorte de « données brutes » qui ne contient pas d'informations de format. La quantité de données est relativement faible et peut être à nouveau formatée, elle est donc assez flexible. Étant donné que PHP est un langage de script qui "compile et s'exécute en même temps", il fournit également une méthode très pratique pour utiliser la mise en cache des jeux de résultats dans une certaine mesure - en utilisant le cache en incluant dynamiquement le segment de code de définition de données correspondant. Si un cache est construit sur "RamDisk", l'efficacité devrait encore être améliorée. Vous trouverez ci-dessous un petit exemple de code pour référence.
// charge les données avec le cache
fonction load_data($id,$cache_lifetime) {
// les données de retour
$données = tableau();
// crée le nom du fichier cache
$cache_filename = 'cache_'.$id.'.php';
// vérifie l'heure de la dernière modification du fichier cache
$cache_filetime = filemtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** le cache n'est pas expiré
include($cache_filename);
} autre {
//** le cache a expiré
// charge les données de la base de données
//...
while ($dbo->nextRecord()) {
// $données[] = ...
}
// formate les données sous forme de fichier php
$data_cache = "
while (list($key, $val) = each($data)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NOM'=>"".qoute($val['NOM'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// enregistre les données dans le fichier cache
si ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
renvoyer $données ;
}
?>
Situations applicables :
1. Les données sont relativement stables, principalement des opérations de lecture.
2. Les opérations sur les fichiers sont plus rapides que les opérations sur la base de données.
3. Accès aux données complexes, accès à de gros volumes de données, accès intensif aux données et charge extrêmement lourde sur la base de données du système.
4. Structure de séparation Web/DB ou structure de base de données unique multi-Web.
Question non confirmée :
1. Si la lecture et l'écriture de fichiers lors d'un accès simultané entraîneront des problèmes de verrouillage.
2. Quelles sont les performances lorsqu'un trop grand nombre de fichiers de données sont impliqués ?
Idées d'extensions :
1. Générez du code de définition de données JavaScript et appelez-le sur le client.
2. Je n’y ai pas encore pensé…
J'espère discuter ensemble.
cache
Si vous souhaitez améliorer les performances de votre énorme application PHP, l'utilisation de la mise en cache est également un bon moyen. Il existe de nombreuses solutions de mise en cache disponibles, notamment : Zend Cache, APC et Afterburner Cache.
Tous ces produits sont des « modules de mise en cache ». Lorsqu'une requête pour un fichier .php se produit pour la première fois, ils enregistrent le code intermédiaire PHP dans la mémoire du serveur Web, puis répondent aux requêtes ultérieures avec la version "compilée". Cette approche peut réellement améliorer les performances des applications car elle réduit au minimum l'accès au disque (le code a été lu et analysé) et le code s'exécute directement en mémoire, ce qui permet au serveur de répondre beaucoup plus rapidement aux requêtes. Bien entendu, le module de mise en cache surveillera également les modifications apportées aux fichiers sources PHP et remettra en cache la page si nécessaire, empêchant ainsi l'utilisateur d'obtenir des pages encore générées par du code PHP obsolète. Étant donné que les modules de mise en cache peuvent réduire considérablement la charge sur le serveur et améliorer l'efficacité de réponse des applications PHP, ils conviennent parfaitement aux sites Web soumis à de lourdes charges.
Comment choisir ces produits de mise en cache
Zend Cache est un logiciel commercial de Zend Technologies, la société mentionnée précédemment qui nous fournit le moteur PHP et Zend Optimizer gratuit. Zend Cache est en effet bien mérité ! Pour les grandes pages PHP, vous pouvez sentir que la vitesse augmentera après la première exécution et que le serveur disposera de plus de ressources disponibles. Malheureusement, ce produit n'est pas gratuit, mais dans certains cas, il peut néanmoins représenter un excellent rapport qualité-prix.
Afterburner Cache est un module de mise en cache gratuit de Bware Technologies. Ce produit est actuellement en version bêta. Afterburner Cache ressemble à Zend Cache, mais il n'améliore pas les performances autant que Zend Cache (encore), et il ne fonctionne pas avec Zend Optimizer.
APC est l'abréviation de Alternative PHP Cache, qui est un autre module de mise en cache gratuit de Community Connect. Le produit est déjà suffisamment stable pour une utilisation formelle et il semble améliorer considérablement la vitesse de réponse aux demandes.
À propos de la compression
Le module gratuit Apache mod_gzip de Remote Communications a la capacité de compresser du contenu Web statique pour les navigateurs prenant en charge ce type d'encodage de contenu. Pour la grande majorité du contenu Web statique, mod_gzip fonctionne très bien. mod_gzip peut être facilement compilé dans Apache et peut également être utilisé comme DSO. Selon Remote Communications, mod_gzip peut également compresser le contenu dynamique de mod_php, mod_perl, etc. J'ai essayé encore et encore, mais cela ne semblait pas fonctionner. J'ai lu de nombreux forums et articles sur mod_gzip, et il semble que ce problème devrait être résolu dans la prochaine version de mod_gzip (probablement la 1.3.14.6f). D'ici là, nous pouvons utiliser mod_gzip sur les parties statiques du site.
Cependant, parfois nous ne souhaitons vraiment pas compresser le contenu dynamique, nous devons donc trouver d'autres moyens. Une solution consiste à utiliser class.gzip_encode.php, qui est une classe PHP qui peut être utilisée pour compresser le contenu de la page en appelant certaines fonctions de la classe au début et à la fin du script PHP. Si vous souhaitez implémenter cette solution au niveau du site Web, vous pouvez appeler ces fonctions depuis les directives auto_prepend et auto_append dans le fichier php.ini. Bien que cette méthode soit efficace, elle entraîne sans aucun doute une surcharge supplémentaire pour les sites Web à forte charge. Pour des instructions détaillées sur la façon d’utiliser cette classe, consultez son code source. La description de son code source est assez complète et l'auteur vous dit tout ce que vous devez savoir.
PHP 4.0.4 a un nouveau gestionnaire de cache de sortie ob_gzhandler, qui est similaire à la classe précédente mais dont l'utilisation est différente. Le contenu suivant doit être ajouté au php.ini lors de l'utilisation de ob_gzhandler :
sortie_handler = ob_gzhandler ;
Cette ligne de code amène PHP à activer la mise en cache de sortie et à compresser tout ce qu'il envoie. Si pour une raison quelconque vous ne souhaitez pas ajouter cette ligne de code au php.ini, vous pouvez également modifier le comportement par défaut du serveur (pas de compression) via le fichier .htaccess dans le répertoire où se trouve le fichier source PHP. La syntaxe. est la suivante :
php_value sortie_handler ob_gzhandler
Ou appelez-le à partir du code PHP, comme suit : ob_start("ob_gzhandler");
La méthode d’utilisation des handles du cache de sortie est en effet très efficace et n’impose aucune charge particulière sur le serveur. Cependant, il convient de noter que Netscape Communicator ne prend pas en charge les graphiques compressés. Par conséquent, à moins que vous puissiez vous assurer que tous les utilisateurs utilisent le navigateur IE, vous devez désactiver les graphiques JPEG et GIF compressés. En général, cette compression fonctionne pour tous les autres fichiers, mais il est recommandé de la tester séparément pour chaque navigateur, surtout si vous utilisez des plug-ins spéciaux ou des visionneuses de données. Ceci est particulièrement important.