-
- /**
- * @author Seraphim
- * @copyright 2012
- * @link http://bbs.it-home.org
- */
- //
- function sendheader($last_modified, $p_type, $content_length = 0)
- {
- //Set the client cache validity time
- header("Expires: " . gmdate("D, d M Y H:i:s", time() + 15360000) . "GMT");
- header(" Cache-Control: max-age=315360000");
- header("Pragma: ");
- // Set the last modification time
- header("Last-Modified: " . $last_modified);
- // Set the file type information
- header($p_type);
- header("Content-Length: " . $content_length);
- }
- define('ABSPATH', dirname(__file__) . '/');
- $cache = true;
- $cachedir = ' cache/'; //The directory where gz files are stored, make sure it is writable
- if (empty($_SERVER['QUERY_STRING']))
- exit();
- $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip ');
- if (empty($gzip))
- $cache = false;
- $key = array_shift(explode('?', $_SERVER['QUERY_STRING']));
- $key = str_replace('../ ', '', $key);
- $filename = ABSPATH . $key;
- $symbol = '_';
- $rel_path = str_replace(ABSPATH, '', dirname($filename));
- $namespace = str_replace( '/', $symbol, $rel_path);
- $cache_filename = ABSPATH . $cachedir . $namespace . $symbol . basename($filename) .
- '.gz'; //Generate gz file path
- $ext = array_pop( explode('.', $filename)); //Judge file type information based on suffix
- $type = "Content-type: text/html"; //Default file type
- switch ($ext)
- {
- case ' css':
- $type = "Content-type: text/css";
- break;
- case 'js':
- $type = "Content-type: text/javascript";
- break;
- case 'gif':
- $cache = false;
- $type = "Content-type: image/gif";
- break;
- case 'jpg':
- $cache = false;
- $type = "Content-type: image/jpeg";
- break ;
- case 'png':
- $cache = false;
- $type = "Content-type: image/png";
- break;
- default:
- exit();
- }
- if ($cache)
- {
- if (file_exists($cache_filename))
- { // If a gz file exists
- $mtime = filemtime($cache_filename);
- $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
- if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==
- $gmt_mtime))
- {
- // with the browser cache The file modification dates are consistent, and 304 is returned
- header("HTTP/1.1 304 Not Modified");
- // Send client header
- header("Content-Encoding:gzip");
- sendheader($gmt_mtime, $type);
- }
- else
- {
- // Read gz file output
- $content = file_get_contents($cache_filename);
- // Send client header
- sendheader($gmt_mtime, $type, strlen($content));
- header(" Content-Encoding: gzip");
- // Send data
- echo $content;
- }
- }
- else
- if (file_exists($filename))
- { // There is no corresponding gz file
- $mtime = mktime();
- $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
- // Read the file
- $content = file_get_contents($filename);
- // Remove the blank part
- / / $content = ltrim($content);
- // Compressed file content
- $content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
- // Send client header
- sendheader($gmt_mtime, $type , strlen($content));
- header("Content-Encoding: gzip");
- //Send data
- echo $content;
- //Write file
- file_put_contents($cache_filename, $content);
- }
- else
- {
- header("HTTP/1.0 404 Not Found");
- }
- }
- else
- { // Process output in Gzip mode. The principle is basically the same as above
- if (file_exists($filename))
- {
- $mtime = filemtime($filename);
- $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
- if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==
- $gmt_mtime))
- {
- // With files in browser cache The modification date is consistent and 304 is returned
- header("HTTP/1.1 304 Not Modified");
- // Send client header
- sendheader($gmt_mtime, $type, strlen($content));
- header("Content-Encoding: gzip");
- }
- else
- {
- // Read file output
- $content = file_get_contents($filename);
- // Send client header
- sendheader($gmt_mtime, $type, strlen($content));
- //Send data
- echo $content;
- }
- }
- else
- {
- header("HTTP/1.0 404 Not Found");
- }
- }
- ?>
-
Copy code
Attachment--------------
illustrate:
1. The compressed files are cached on the server, and accessing them again reduces recompression time and CPU usage.
2. By setting the client file cache time to reduce the number of re-requests, it can be reduced by more than 85%.
3. Because the image is already in a compressed format, only the client cache time is set and no compression is performed.
How to use:
1. The server must support gzip and Rewrite functions.
2. Add the following code in the line below "RewriteBase/" in the .htacess file:
RewriteRule (.*.css$|.*.js$|.*.jpg$|.*.gif$|.*.png$) gzip.php?$1 [L]
3. Upload gzip.php to the root directory
4. Create a cache folder in the root directory to ensure it is readable and writable.
|