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

  1. <?php
  2. /**
  3. * Function_Cache
  4. * Purpose:
  5. *   Caching the result and output of functions.
  6. * Example:
  7. *     require_once "Cache/Function.php";
  8. *
  9. *     $FUNCTION_CACHE_CONTAINER = "file";
  10. *     $FUNCTION_CACHE_CONTAINER_OPTIONS = array(
  11. *         "cache_dir" => "/tmp/",
  12. *         "filename_prefix" => "cache_");
  13. *
  14. *     function foo($string)
  15. *     {
  16. *         print $string . "<br>";
  17. *         for($i=1;$i<10000000;$i++){}
  18. *         return strrev($string);
  19. *     }
  20. *     print cached_function_call("foo", "test");
  21. * Note:
  22. *   You cannot cache every function. You should only cache 
  23. *   functions that only depend on their arguments and don't use
  24. *   global or static variables, don't rely on database queries or 
  25. *   files, and so on.
  26. * @author       Sebastian Bergmann <sb@sebastian-bergmann.de>
  27. * @module       Function_Cache
  28. * @modulegroup  Function_Cache
  29. * @package      Cache
  30. * @version      $Revision: 1.6 $
  31. * @access       public
  32. */
  33.  
  34. // +----------------------------------------------------------------------+
  35. // | PHP version 4.0                                                      |
  36. // +----------------------------------------------------------------------+
  37. // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
  38. // +----------------------------------------------------------------------+
  39. // | This source file is subject to version 2.0 of the PHP license,       |
  40. // | that is bundled with this package in the file LICENSE, and is        |
  41. // | available at through the world-wide-web at                           |
  42. // | http://www.php.net/license/2_02.txt.                                 |
  43. // | If you did not receive a copy of the PHP license and are unable to   |
  44. // | obtain it through the world-wide-web, please send a note to          |
  45. // | license@php.net so we can mail you a copy immediately.               |
  46. // +----------------------------------------------------------------------+
  47. // | Authors: Sebastian Bergmann <sb@sebastian-bergmann.de>               |
  48. // +----------------------------------------------------------------------+
  49. //
  50. // $Id: Function.php,v 1.6 2001/03/03 19:17:20 uw Exp $
  51.  
  52. require_once 'Cache.php';
  53.  
  54. /**
  55. * Calls a cacheable function or method.
  56. *
  57. * @return mixed $result
  58. * @access public
  59. */
  60. function cached_function_call()
  61. {
  62.     global $FUNCTION_CACHE_CONTAINER, $FUNCTION_CACHE_CONTAINER_OPTIONS;
  63.     static $cache;
  64.  
  65.     // create Cache object, if needed
  66.     if (!is_object($cache))
  67.     {
  68.         $cache = new Cache($FUNCTION_CACHE_CONTAINER, $FUNCTION_CACHE_CONTAINER_OPTIONS);
  69.     }
  70.  
  71.     // get arguments
  72.     $arguments = func_get_args();
  73.  
  74.     // generate cache id
  75.     $id = md5(serialize($arguments));
  76.  
  77.     // query cache
  78.     $cached_object = $cache->get($id);
  79.  
  80.     // cache hit
  81.     if ($cached_object != NULL)
  82.     {
  83.         $output = $cached_object[0];
  84.         $result = $cached_object[1];
  85.     }
  86.  
  87.     // cache miss
  88.     else
  89.     {
  90.         $function_name = array_shift($arguments);
  91.  
  92.         // call function, save output and result
  93.         ob_start();
  94.         $result = call_user_func_array($function_name, $arguments);
  95.         $output = ob_get_contents();
  96.         ob_end_clean();
  97.  
  98.         // store output and result of function call in cache
  99.         $cache->save($id, array($output, $result));
  100.     }
  101.  
  102.     print $output;
  103.     return $result;
  104. }
  105. ?>