home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / HTTP / Compress.php
PHP Script  |  2001-01-20  |  3KB  |  83 lines

  1. <?php
  2. /**
  3.  * HTTP_Compress:: provides a wrapper around php's output buffering
  4.  * mechanisms and also does compression, generates headers - ETag,
  5.  * Content-Length, etc. - which may be beneficial to bandwidth
  6.  * usage and performance.
  7.  *
  8.  * @author Mark Nottingham <mnot@pobox.com>
  9.  * @author Chuck Hagenbuch <chuck@horde.org>
  10.  * @version $Revision: 1.2 $
  11.  */
  12. class HTTP_Compress {
  13.     
  14.     /**
  15.      * Start the output buffer, and make sure that implicit flush is
  16.      * off so that data is always buffered.
  17.      */
  18.     function start()
  19.     {
  20.         ob_start();
  21.         ob_implicit_flush(0);
  22.     }
  23.     
  24.     /**
  25.      * Output the contents of the output buffer, compressed if
  26.      * desired, along with any relevant headers.
  27.      *
  28.      * @param boolean $compress (optional) Use gzip compression, if the browser supports it.
  29.      * @param boolean $use_etag Generate an ETag, and don't send the body if the browser has the same object cached.
  30.      * @param boolean $send_body Send the body of the request? Might be false for HEAD requests.
  31.      */
  32.     function output($compress = true, $use_etag = true, $send_body = true)
  33.     {
  34.         $min_gz_size = 1024;
  35.         $page = ob_get_contents();
  36.         $length = strlen($page);
  37.         ob_end_clean();
  38.         
  39.         if ($compress && extension_loaded('zlib') && (strlen($page) > $min_gz_size) && isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_ACCEPT_ENCODING'])) {
  40.             $ae = explode(',', str_replace(' ', '', $GLOBALS['HTTP_SERVER_VARS']['HTTP_ACCEPT_ENCODING']));
  41.             $enc = false;
  42.             if (in_array('gzip', $ae)) {
  43.                 $enc = 'gzip';
  44.             } else if (in_array('x-gzip', $ae)) {
  45.                 $enc = 'x-gzip';
  46.             }
  47.             
  48.             if ($enc) {
  49.                 $page = gzencode($page);
  50.                 $length = strlen($page);
  51.                 header('Content-Encoding: ' . $enc);
  52.                 header('Vary: Accept-Encoding');
  53.             } else {
  54.                 $compress = false;
  55.             }
  56.         } else {
  57.             $compress = false;
  58.         }
  59.         
  60.         if ($use_etag) {
  61.             $etag = '"' . md5($page) . '"';
  62.             header('ETag: ' . $etag);
  63.             if (isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_IF_NONE_MATCH'])) {
  64.                 $inm = explode(',', $GLOBALS['HTTP_SERVER_VARS']['HTTP_IF_NONE_MATCH']);
  65.                 foreach ($inm as $i) {
  66.                     if (trim($i) == $etag) {
  67.                         header('HTTP/1.0 304 Not Modified');
  68.                         $send_body = false;
  69.                         break;
  70.                     }
  71.                 }
  72.             }
  73.         }
  74.         
  75.         if ($send_body) {
  76.             header('Content-Length: ' . $length);
  77.             echo $page;
  78.         }
  79.     }
  80.     
  81. }
  82. ?>
  83.