Home >Backend Development >PHP Tutorial >Detailed explanation of techniques for caching and compressing dynamic pages in PHP
mod_gzip is an Apache module whose function is to use Gzip to compress static html pages. Browsers that follow the IETF standard can accept gzip encoding (IE, Netscape, etc.). mod_gzip can increase the download time of a page by 4-5 times. I strongly recommend you use mod_gzip on your web server. However, we also had to build our own compression engine in PHP. In this article, I will introduce how to use PHP's output control function to greatly speed up page loading speed.
Introduction to PHP's output control function
The most satisfying thing about PHP4 is that you can let PHP cache all the output generated by the script before you decide to send them out Previously, the browser would not receive any content. In a script, you can use these functions to set headers and cookies, but this is only a small part of the powerful output functions.
<?php void ob_start(void); ?>
Tells the PHP processor to redirect all output to an internal cache (buffer). No output will be sent to the browser until ob_start is called.
<?php string ob_get_contents(void); ?>
This function returns the "output buffer" in the form of a string. You can call this function to send the accumulated output to the browser. (Only after turning off the buffering function!!)
<?php int ob_get_length(void); ?>
Return the length of the string in the cache.
<?php void ob_end_clean(void); ?>
Clear the output cache and turn off the output cache. This function must be used before the content in the cache is output to the browser.
void 501([int flag])
Used to turn on/off the implicit flush action switch (default is off). If flush is turned on, every time print/echo or other output commands are called, the output content will be immediately sent to the browser.
Use output controls to compress PHP output
You must use the Zlib extension package compiled in PHP4 to compress the output. If necessary, you can view the installation instructions for the Zlib package in the PHP documentation.
First, initialize the output cache:
<?php ob_start(); ob_implicit_flush(0); ?>
After that, use print, echo, or other methods you like to generate all output content, for example:
<?php print("Hey this is a compressed output!"); ?>
After the page is generated, we retrieve it Output content:
<?php $contents = ob_get_contents(); ob_end_clean(); ?>
After that, it must be detected whether the browser supports compressed data. If supported, the browser will send an ACCEPT-ENCODEING HTTP header to the server. We only need to check if there is a "gzip,deflate" string in the $HTTP_ACCEPT_ENCODING variable.
<?php if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) { // 在这里生成 Gzip 压缩的内容 } else { echo $contents; } ?>
This method is simple to use and has a clear structure. Let's see how to generate compressed output:
<?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); } } ?> //好了,你还可以按此方式附加上更多的压缩数据。
For actual testing, all the script code is as follows:
<?php ob_start(); ob_implicit_flush(0); print("I'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); } } ?>
Caching PHP output
When PHP4 is still available Before it came out, when I had to use PHP3, I was very interested in developing some caching mechanisms to reduce database loading and file system access. There is no particularly good method in PHP3, but with output caching, everything becomes much easier in PHP4.
Here is a simple example:
<?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); ?>
This is a simple example, using output caching, you can build a complex content generation system, using different caching mechanisms for different blocks or programs, Wait...
Conclusion
PHP output control function is very useful for redirecting the output generated by the script to the cache. Outputting compressed cached data for browsers that support gzip can reduce load times. It can also be used as a caching mechanism to reduce access to data sources (databases or files), which is of great significance when using XML.
If we build an engine in PHP, cache data from data sources (xml documents and databases), and dynamically generate content in XML format (without appearance-presentation) we can get the output of these XML and use XSLT Convert to any format we want (html, wap, palm, pdf, etc.). This task can be accomplished nicely using PHP4's output caching and the Sablotron XSLT extension.
The above is the detailed content of Detailed explanation of techniques for caching and compressing dynamic pages in PHP. For more information, please follow other related articles on the PHP Chinese website!