Maison  >  Article  >  développement back-end  >  Explication détaillée des techniques de mise en cache et de compression des pages dynamiques en PHP

Explication détaillée des techniques de mise en cache et de compression des pages dynamiques en PHP

伊谢尔伦
伊谢尔伦original
2017-06-24 13:40:181078parcourir

mod_gzip est un module Apache dont la fonction est d'utiliser Gzip pour compresser des pages html statiques. Les navigateurs qui suivent le standard IETF peuvent accepter l'encodage gzip (IE, Netscape, etc.). mod_gzip peut augmenter le temps de téléchargement d'une page de 4 à 5 fois. Je vous recommande fortement d'utiliser mod_gzip sur votre serveur Web. Cependant, nous avons également dû construire notre propre moteur de compression en PHP. Dans cet article, je vais vous présenter comment utiliser la fonction de contrôle de sortie de PHP pour accélérer considérablement la vitesse de chargement des pages.

Présentation des fonctions de contrôle de sortie de PHP

La chose la plus satisfaisante à propos de PHP4 est que vous pouvez laisser PHP mettre en cache toutes les sorties générées par le script avant de décider de les envoyer. Auparavant, le le navigateur ne recevrait aucun contenu. Dans un script, vous pouvez utiliser ces fonctions pour définir des en-têtes et des cookies, mais cela ne représente qu'une petite partie des puissantes fonctions de sortie.

<?php 
void ob_start(void); 
?>

indique au processeur PHP de rediriger toutes les sorties vers un tampon interne. Aucune sortie ne sera envoyée au navigateur tant que ob_start ne sera pas appelé.

<?php 
string ob_get_contents(void); 
?>

Cette fonction renvoie le "tampon de sortie" sous forme de chaîne. Vous pouvez appeler cette fonction pour envoyer la sortie accumulée au navigateur. (Seulement après avoir désactivé la fonction de mise en mémoire tampon !!)

<?php 
int ob_get_length(void); 
?>

Renvoie la longueur de la chaîne dans le cache.

<?php 
void ob_end_clean(void); 
?>

Videz le cache de sortie et désactivez le cache de sortie. Cette fonction doit être utilisée avant que le contenu du cache ne soit envoyé au navigateur.
void 501([int flag])
Utilisé pour activer/désactiver le commutateur d'action de chasse implicite (la valeur par défaut est désactivée). Si flush est activé, chaque fois que print/echo ou d'autres commandes de sortie sont appelées, le contenu de sortie sera immédiatement envoyé au navigateur.

Utilisez les contrôles de sortie pour compresser la sortie PHP
Vous devez utiliser le package d'extension Zlib compilé en PHP4 pour compresser la sortie. Si nécessaire, vous pouvez consulter les instructions d'installation du package Zlib dans la documentation PHP.
Tout d'abord, initialisez le cache de sortie :

<?php 
ob_start(); 
ob_implicit_flush(0); 
?>

Après cela, utilisez print, echo ou d'autres méthodes que vous aimez pour générer tout le contenu de sortie, par exemple :

<?php
print("Hey this is a compressed output!"); 
?>

Une fois la page générée, nous récupérons le contenu de sortie :

<?php 
$contents = ob_get_contents(); 
ob_end_clean(); 
?>

Après cela, nous devons détecter si le navigateur prend en charge les données compressées. S'il est pris en charge, le navigateur enverra un en-tête HTTP ACCEPT-ENCODEING au serveur. Il suffit de vérifier s'il y a une chaîne "gzip,deflate" dans la variable $HTTP_ACCEPT_ENCODING.

<?php 
if(ereg(&#39;gzip, deflate&#39;,$HTTP_ACCEPT_ENCODING)) { 
// 在这里生成 Gzip 压缩的内容 
} else { 
echo $contents; 
} 
?>

Cette méthode est simple à utiliser et clairement structurée. Voyons comment générer une sortie compressée :

<?php 
//告诉浏览器将要收到的是gzip数据 
//当然在此之前,你已经检查了它们是否支持gzip,x-gzip数据格式 
//如果支持的是x-gzip,那么下面的头就要用z-gzip来代替 
header("Content-Encoding: gzip");
//显示gzip文件的头 
//只需显示一次 
echo "x1fx8bx08x00x00x00x00x00";
//计算出文件的大小和CRC码 
$Size = strlen($contents); 
$Crc = crc32($contents);
//压缩数据 
$contents = gzcompress($contents, 9);
//我们不能就这样输出,因为CRC码是混乱的。 
//如果我在这里使用“echo $contents”,压缩的数据会被送出, 
//但是却不完整。文件最后的四个字节是CRC校验码,可是只发出去了三个字节。 
//最后一个字节被丢掉了。我不知道这个bug在4.0.2版中解决了没有, 
//不过最好避免错误的方法是把正确的CRC校验码加到压缩的数据的末尾。 
// 
//把旧的CRC校验码剥离 
$contents = substr($contents, 0, strlen($contents) - 4);
//仅显示压缩的数据 
echo $contents;
//输出CRC,和原来数据的大小(字节) 
gzip_PrintFourChars($Crc); 
gzip_PrintFourChars($Size);
function gzip_PrintFourChars($Val) { 
for ($i = 0; $i <4; $i ++) { 
echo chr($Val % 256); 
$Val = floor($Val / 256); 
} 
}
?> 
//好了,你还可以按此方式附加上更多的压缩数据。

Pour les tests réels, tout le code du script est le suivant :

<?php 
ob_start(); 
ob_implicit_flush(0);
print("I&#39;m compressed!n");
$contents = ob_get_contents(); 
ob_end_clean();
header("Content-Encoding: gzip");
echo "x1fx8bx08x00x00x00x00x00";
$Size = strlen($contents); 
$Crc = crc32($contents);
$contents = gzcompress($contents, 9);
$contents = substr($contents, 0, strlen($contents) - 4);
echo $contents;
gzip_PrintFourChars($Crc); 
gzip_PrintFourChars($Size);
function gzip_PrintFourChars($Val) { 
for ($i = 0; $i <4; $i ++) { 
echo chr($Val % 256); 
$Val = floor($Val / 256); 
} 
} 
?>

Cache la sortie PHP

Quand PHP4 avait pas encore sorti et je devais utiliser PHP3, j'étais très intéressé par le développement de mécanismes de mise en cache pour réduire le chargement de la base de données et l'accès au système de fichiers . Il n’existe pas de méthode particulièrement efficace en PHP3, mais avec la mise en cache de sortie, tout devient beaucoup plus simple en PHP4.
Voici un exemple simple :

<?php 
//为请求的URI构造一个文件名 
$cached_file=md5($REQUEST_URI);

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) { 
//is_valid函数验证缓存,你可以用这个函数检查Cache是否过期或其他特定的条件。 
//如果文件不在Cache中或者不可用则生成输出 
ob_start(); 
ob_implicit_flush(0); 
//在此输出……
$contents = ob_get_contents(); 
ob_end_clean(); 
$fil=fopen($cached_file,"w+"); 
fwrite($fil,$contents,$strlen($contents)); 
fclose($fil); 
}
/如果请求的文件在缓存中且可用,则: 
readfile($cached_file);
?>

Ceci est un exemple simple, en utilisant la mise en cache de sortie, vous pouvez créer un système de génération de contenu complexe en utilisant différents caches pour différents morceaux ou programmes, mécanismes, etc...

Conclusion

Les fonctions de contrôle de sortie PHP sont très utiles pour rediriger la sortie générée par les scripts vers le cache. La sortie des données de cache remplacées pour les navigateurs prenant en charge gzip peut réduire les temps de chargement. Il peut également être utilisé comme mécanisme de mise en cache pour réduire l'accès aux sources de données (bases de données ou fichiers), ce qui est très important lors de l'utilisation de XML.
Si nous construisons un moteur en PHP, mettons en cache les données des sources de données (documents XML et bases de données) et générons dynamiquement du contenu au format XML (sans présentation-apparence), nous pouvons obtenir la sortie de ces XML et utiliser XSLT Convert en n'importe quel format souhaité (html, wap, palm, pdf, etc.). Cette tâche peut être bien accomplie en utilisant la mise en cache de sortie de PHP4 et l'extension Sablotron XSLT.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn