home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / Cache / Graphics.php < prev    next >
PHP Script  |  2001-03-06  |  12KB  |  311 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP version 4.0                                                      |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: Graphics.php,v 1.5 2001/03/06 15:27:30 sbergmann Exp $
  19.  
  20. require_once 'Cache.php';
  21.  
  22. /**
  23. * Graphics disk cache.
  24. * The usual way to create images is to pass some arguments that describe the image 
  25. * to a script that dynamically creates an image. For every image of a page 
  26. * a new PHP interpreter gets started. This is a good way to kill your webserver.
  27. * When dealing with dynamically generated images you should not call another script 
  28. * to generate the images but generate the images by the script that produces the page
  29. * that contains the images. This is a major improvement but it's only half the way.
  30. * There's no need to rerender an image on every request. A simple disk cache can reduce
  31. * the computation time dramatically. This is what the class graphics_cache is for. 
  32. * Usage:
  33. * // create an instance of the graphics cache
  34. * $cache = new graphics_cache;
  35. *
  36. * $img = ImageCreate(...);
  37. *
  38. * // compute an ID for your image based on typical parameters
  39. * $id = m5d( $size, $colors, $label);
  40. * // check if it's cached
  41. * if (!($link = $cache->getImageLink($id, "gif"))) {
  42. *  
  43. *   // hmmm, it's not cached, create it
  44. *   ...
  45. *   // cacheImageLink() and cacheImage() make the ImageGIF() call!
  46. *   // cacheImage() returns the value of ImageGIF() [etc.], cacheImageLink() returns a URL
  47. *   $link = $cache->cacheImageLink($id, $img, "gif");
  48. * }
  49. *
  50. * // Ok, let's build the ImageLink
  51. * $size = getImageSize($link[0]);
  52. * printf('<img src="%s" %s>', $link[1], $size[3]);
  53. *
  54. * // for cacheImage():
  55. * // header("Content-type: image/gif"); print $cache->cacheImage($id, $img, "gif");
  56. *
  57. * The class requires PHP 4.0.2+ [ImageType()]. Note that cacheImage() works with
  58. * the output buffer. Modify it if required!
  59. *
  60. * @author   Ulf Wendel <ulf.wendel@phpdoc.de>
  61. * @version  $Id: Graphics.php,v 1.5 2001/03/06 15:27:30 sbergmann Exp $
  62. * @package  Cache
  63. */
  64. class Cache_Graphics extends Cache {
  65.  
  66.     /**
  67.     * Cache URL prefix.
  68.     * 
  69.     * Make sure that the cache URL prefix points to the $cache_dir, otherwise
  70.     * your links will be broken. Use setCacheURL to specify the cache_url and 
  71.     * setCacheDir() for the cache_dir.
  72.     * 
  73.     * @var  string
  74.     * @see  setCacheURL(), setCacheDir()
  75.     */
  76.     var $cache_url = "";
  77.  
  78.     /**
  79.     * Directory where cached files get stored.
  80.     * s
  81.     * Make sure that the cache_dir is writable and offers enough space. Check 
  82.     * also if your cache_url points to the directory. Use setCacheDir() to set
  83.     * the variable.
  84.     * 
  85.     * @var  string
  86.     * @see  setCacheDir(), setCacheURL()
  87.     */
  88.     var $cache_dir = "";
  89.  
  90.     /**
  91.     * Nameprefix of cached files.
  92.     * 
  93.     * Per default the prefix "graphics_" gets used. You might use this 
  94.     * for versioning or to ease (manual) clean ups.
  95.     *
  96.     * @var      string
  97.     */
  98.     var $cache_file_prefix = "graphics_";
  99.  
  100.     /**
  101.     * Mapping from supported image type to a ImageType() constant.
  102.     * 
  103.     * Referr to the PHP manual for more informations on ImageType()
  104.     * 
  105.     * @var  array
  106.     * @link http://www.php.net/ImageType
  107.     */
  108.     var $imagetypes = array(
  109.                                 "gif"   => IMG_GIF, 
  110.                                 "jpg"   => IMG_JPG,
  111.                                 "png"   => IMG_PNG,
  112.                                 "wbmp"  => IMG_WBMP
  113.                             );
  114.  
  115.     /**
  116.     * TODO: add docs
  117.     */
  118.     function graphics_cache() {
  119.         $this->cache("cache_container_file", array("cache_dir" => $this->cache_dir, "filename_prefix" => $this->cache_file_prefix));
  120.     } // end constructor
  121.  
  122.     /**
  123.     * Returns the content of a cached image file.
  124.     * 
  125.     * This function can be used to send the image directly to the browser.
  126.     * Make sure that you send a correspondending header before sending the image itself.
  127.     *
  128.     * Always try to get the image from the cache before you compute it. See 
  129.     * the class docs for an example.
  130.     *
  131.     * @param    string  Image-ID
  132.     * @param    string  Image type: gif, jpg, png, wbmp
  133.     * @return   string  Image file contents if a cached file exists otherwise an empty string
  134.     * @see      cacheImage()
  135.     */                                    
  136.     function getImage($id, $format = "png") {
  137.         $id = $this->generateID(array("id" => $id, "format" => strtolower($format)));
  138.         
  139.         return $this->get($id);
  140.     } // end func getImage
  141.  
  142.     /**
  143.     * Returns an array with a link to the cached image and the image file path.
  144.     * 
  145.     * Always try to get the image from the cache before you compute it. See 
  146.     * the class docs for an example.
  147.     *
  148.     * @param    string  Image-ID
  149.     * @param    string  Image type: gif, jpg, png, wbmp
  150.     * @return   array   [ full path to the image file, image url ]
  151.     * @throw    gerror
  152.     * @see      cacheImageLink()
  153.     */
  154.     function getImageLink($id, $format = "png") {
  155.         $id = $this->generateID(array("id" => $id, "format" => strtolower($format)));
  156.         if (!$this->container->idExists($id)) 
  157.             return array();
  158.  
  159.         $file = $this->cache_url . $this->cache_file_prefix . $id;
  160.  
  161.         return array($this->container->getFilename($id), $file);
  162.     } // end func getImageLink
  163.  
  164.     /**
  165.     * Create an image from the given image handler, cache it and return the file content.
  166.     *
  167.     * Always try to retrive the image from the cache before you compute it.
  168.     * 
  169.     * Warning: this function uses the output buffer. If you expect collisions 
  170.     * modify the code.
  171.     *
  172.     * @param    string  Image-ID. Used as a part of the cache filename.
  173.     *                   Use md5() to generate a "unique" ID for your image
  174.     *                   based on characteristic values such as the color, size etc.
  175.     * @param    string  Image handler to create the image from.
  176.     * @param    string  Image type: gif, jpg, png, wbmp. Also used as filename suffix.
  177.     *                   If an unsupported type is requested the functions tries to 
  178.     *                   fallback to a supported type before throwing an exeption.
  179.     * @return   string  Image content returned by ImageGIF/... 
  180.     * @throws   gerror
  181.     * @access   public
  182.     * @see      getImage()
  183.     */
  184.     function cacheImage($id, &$img, $format = "png") {
  185.         if (!$id)
  186.             return new gerror("You must provide an ID for and image to be cached!");
  187.  
  188.         $id = $this->generateID(array("id" => $id, "format" => strtolower($format)));
  189.         
  190.         // Check if the requested image type is supported by the GD lib.
  191.         // If not, try a callback to the first available image type.
  192.         if (!isset($this->imagetypes[$format]) || !(ImageTypes() & $this->imagetypes[$format])) {
  193.             foreach ($this->imagetypes as $supported => $bitmask) 
  194.                 if (ImageTypes() & $bitmask)
  195.                     new gerror("The build in GD lib does not support the image type $format. Fallback to $supported.");
  196.                 else
  197.                     return new gerror("Hmm, is you PHP build with GD support? Can't find any supported types.");
  198.         }
  199.  
  200.         if ($image = $this->get($id))
  201.             return $image;
  202.  
  203.         // save the image to the output buffer, write it to disk and 
  204.         // return the image.
  205.         ob_end_clean();
  206.         ob_start(); 
  207.  
  208.         // generate the image
  209.         $func = "Image" . strtoupper($format);    
  210.         $func($img);
  211.         ImageDestroy($img);
  212.  
  213.         ob_end();
  214.         $image = ob_get_contents();
  215.         ob_end_clean();
  216.  
  217.         // save the generated image to disk
  218.         $this->save($id, $image, 0);
  219.  
  220.         return $image;
  221.     } // end func cacheImage
  222.  
  223.     /**
  224.     * Create an image from the given image handler, cache it and return a url and the file path of the image.
  225.     *
  226.     * Always try to retrive the image from the cache before you compute it.
  227.     *
  228.     * @param    string  Image-ID. Used as a part of the cache filename.
  229.     *                   Use md5() to generate a "unique" ID for your image
  230.     *                   based on characteristic values such as the color, size etc.
  231.     * @param    string  Image handler to create the image from.
  232.     * @param    string  Image type: gif, jpg, png, wbmp. Also used as filename suffix.
  233.     *                   If an unsupported type is requested the functions tries to 
  234.     *                   fallback to a supported type before throwing an exeption.
  235.     * @return   array  [ full path to the image file, image url ]
  236.     * @throws   gerror
  237.     * @access   public
  238.     */
  239.  
  240.     function cacheImageLink($id, &$img, $format = "png") {
  241.         if (!$id)
  242.             return new gerror("You must provide an ID for and image to be cached!");
  243.  
  244.         $id = $this->generateID(array("id" => $id, "format" => strtolower($format));
  245.  
  246.         // Check if the requested image type is supported by the GD lib.
  247.         // If not, try a callback to the first available image type.
  248.         if (!isset($this->imagetypes[$format]) || !(ImageTypes() & $this->imagetypes[$format])) {
  249.             foreach ($this->imagetypes as $supported => $bitmask) 
  250.                 if (ImageTypes() & $bitmask)
  251.                     new gerror("The build in GD lib does not support the image type $format. Fallback to $supported.");
  252.                 else
  253.                     return new gerror("Hmm, is you PHP build with GD support? Can't find any supported types.");
  254.         }
  255.  
  256.         $url = $this->cache_url . $this->cache_file_prefix . $id;
  257.         $ffile = $this->container->getFilename($id);
  258.  
  259.         if ($this->isCached($id) && !isExpired($id))
  260.             return array($ffile, $url)
  261.  
  262.         $func = "Image" . strtoupper($format);    
  263.         $func($img, $ffile);
  264.  
  265.         ImageDestroy($img);
  266.  
  267.         return array($ffile, $url);
  268.     } // end func cacheImageLink
  269.  
  270.     /**
  271.     * Sets the URL prefix used when rendering HTML Tags. 
  272.     * 
  273.     * Make sure that the URL matches the cache directory, 
  274.     * otherwise you'll get broken links.
  275.     * 
  276.     * @param    string
  277.     * @access   public
  278.     * @see      setCacheDir()
  279.     */
  280.     function setCacheURL($cache_url) {
  281.         if ($cache_url && "/" != substr($cache_url, 1)) 
  282.             $cache_url .= "/";
  283.             
  284.         $this->cache_url = $cache_url;
  285.         
  286.     } // end func setCacheURL
  287.  
  288.     /**
  289.     * Sets the directory where to cache generated Images
  290.     * 
  291.     * @param    string
  292.     * @access   public
  293.     * @see      setCacheURL()
  294.     */
  295.     function setCacheDir($cache_dir) {
  296.         if ($cache_dir && "/" != substr($cache_dir, 1))
  297.             $cache_dir .= "/";
  298.  
  299.         $this->cache_dir = $cache_dir;
  300.         $this->container->cache_dir = $cache_dir;
  301.     } // end func setCacheDir
  302. } // end class Cache_Graphics
  303. ?>