Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Techniken zum Zwischenspeichern und Komprimieren dynamischer Seiten in PHP

Detaillierte Erläuterung der Techniken zum Zwischenspeichern und Komprimieren dynamischer Seiten in PHP

伊谢尔伦
伊谢尔伦Original
2017-06-24 13:40:181075Durchsuche

mod_gzip ist ein Apache-Modul, dessen Funktion darin besteht, Gzip zum Komprimieren statischer HTML-Seiten zu verwenden. Browser, die dem IETF-Standard folgen, können die Gzip-Kodierung akzeptieren (IE, Netscape usw.). mod_gzip kann die Downloadzeit einer Seite um das 4- bis 5-fache verlängern. Ich empfehle Ihnen dringend, mod_gzip auf Ihrem Webserver zu verwenden. Allerdings mussten wir auch eine eigene Komprimierungs-Engine in PHP erstellen. In diesem Artikel werde ich vorstellen, wie man die Ausgabekontrollfunktion von PHP verwendet, um die Seitenladegeschwindigkeit erheblich zu beschleunigen.

Einführung in die Ausgabekontrollfunktionen von PHP

Das Befriedigendste an PHP4 ist, dass Sie PHP die gesamte vom Skript generierte Ausgabe zwischenspeichern lassen können, bevor Sie sich entscheiden, sie zu versenden Der Browser würde keine Inhalte empfangen. In einem Skript können Sie diese Funktionen zum Setzen von Headern und Cookies verwenden, dies ist jedoch nur ein kleiner Teil der leistungsstarken Ausgabefunktionen.

<?php 
void ob_start(void); 
?>

weist den PHP-Prozessor an, alle Ausgaben in einen internen Puffer umzuleiten. Es wird keine Ausgabe an den Browser gesendet, bis ob_start aufgerufen wird.

<?php 
string ob_get_contents(void); 
?>

Diese Funktion gibt den „Ausgabepuffer“ als String zurück. Sie können diese Funktion aufrufen, um die gesammelte Ausgabe an den Browser zu senden. (Nur nach Ausschalten der Pufferfunktion!!)

<?php 
int ob_get_length(void); 
?>

Gibt die Länge der Zeichenfolge im Cache zurück.

<?php 
void ob_end_clean(void); 
?>

Leeren Sie den Ausgabecache und schalten Sie den Ausgabecache aus. Diese Funktion muss verwendet werden, bevor der Inhalt im Cache an den Browser ausgegeben wird.
void 501([int flag])
Wird zum Ein-/Ausschalten des impliziten Flush-Aktionsschalters verwendet (Standard ist aus). Wenn Flush aktiviert ist, wird der Ausgabeinhalt jedes Mal, wenn print/echo oder andere Ausgabebefehle aufgerufen werden, sofort an den Browser gesendet.

Verwenden Sie Ausgabesteuerungen, um die PHP-Ausgabe zu komprimieren.
Sie müssen das in PHP4 kompilierte Zlib-Erweiterungspaket verwenden, um die Ausgabe zu komprimieren. Bei Bedarf können Sie die Installationsanweisungen für das Zlib-Paket in der PHP-Dokumentation einsehen.
Initialisieren Sie zunächst den Ausgabecache:

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

Verwenden Sie anschließend Print, Echo oder andere Methoden Ihrer Wahl, um den gesamten Ausgabeinhalt zu generieren, zum Beispiel:

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

Nachdem die Seite generiert wurde, rufen wir den Ausgabeinhalt ab:

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

Danach müssen wir erkennen, ob der Browser komprimierte Daten unterstützt. Sofern unterstützt, sendet der Browser einen ACCEPT-ENCODEING-HTTP-Header an den Server. Wir müssen nur prüfen, ob in der Variablen $HTTP_ACCEPT_ENCODING eine Zeichenfolge „gzip,deflate“ vorhanden ist.

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

Diese Methode ist einfach anzuwenden und klar strukturiert. Sehen wir uns an, wie man eine komprimierte Ausgabe generiert:

<?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); 
} 
}
?> 
//好了,你还可以按此方式附加上更多的压缩数据。

Für tatsächliche Tests lautet der gesamte Skriptcode wie folgt:

<?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); 
} 
} 
?>

PHP-Ausgabe zwischenspeichern

Als PHP4 hatte noch nicht herausgekommen war und ich PHP3 verwenden musste, war ich sehr daran interessiert, einige Caching-Mechanismen zu entwickeln, um das Laden der Datenbank und den Zugriff auf das Dateisystem zu reduzieren. In PHP3 gibt es keine besonders gute Methode, aber mit Output-Caching wird in PHP4 alles viel einfacher.
Hier ist ein einfaches Beispiel:

<?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);
?>

Dies ist ein einfaches Beispiel. Mithilfe von Ausgabe-Caching können Sie ein komplexes System zur Inhaltsgenerierung aufbauen, das verschiedene Caches für verschiedene Chunks oder Programme, Mechanismen usw. verwendet.

Fazit

PHP-Ausgabekontrollfunktionen sind sehr nützlich, um die von Skripten generierte Ausgabe in den Cache umzuleiten. Die Ausgabe überschriebener Cache-Daten für Browser, die gzip unterstützen, kann die Ladezeiten verkürzen. Es kann auch als Caching-Mechanismus verwendet werden, um den Zugriff auf Datenquellen (Datenbanken oder Dateien) zu reduzieren, was bei der Verwendung von XML von großer Bedeutung ist.
Wenn wir eine Engine in PHP erstellen, Daten aus Datenquellen (XML-Dokumente und Datenbanken) zwischenspeichern und dynamisch Inhalte im XML-Format generieren (ohne Darstellungsdarstellung), können wir die Ausgabe dieser XML-Dateien erhalten und XSLT in beliebige konvertieren Format, das wir wollen (HTML, WAP, Palm, PDF usw.). Diese Aufgabe kann mithilfe des Ausgabecachings von PHP4 und der Sablotron XSLT-Erweiterung gut gelöst werden.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Techniken zum Zwischenspeichern und Komprimieren dynamischer Seiten in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn