[ Index ]
 

Code source de Mantis 1.1.0rc3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/api/soap/nusoap/ -> class.wsdlcache.php (source)

   1  <?php
   2  /*

   3  The NuSOAP project home is:

   4  http://sourceforge.net/projects/nusoap/

   5  

   6  The primary support for NuSOAP is the mailing list:

   7  nusoap-general@lists.sourceforge.net

   8  */
   9  
  10  /**

  11  * caches instances of the wsdl class

  12  * 

  13  * @author   Scott Nichol <snichol@users.sourceforge.net>

  14  * @author    Ingo Fischer <ingo@apollon.de>

  15  * @version  $Id: class.wsdlcache.php,v 1.7 2007/04/17 16:34:03 snichol Exp $

  16  * @access public 

  17  */
  18  class nusoap_wsdlcache {
  19      /**

  20       *    @var resource

  21       *    @access private

  22       */
  23      var $fplock;
  24      /**

  25       *    @var integer

  26       *    @access private

  27       */
  28      var $cache_lifetime;
  29      /**

  30       *    @var string

  31       *    @access private

  32       */
  33      var $cache_dir;
  34      /**

  35       *    @var string

  36       *    @access public

  37       */
  38      var $debug_str = '';
  39  
  40      /**

  41      * constructor

  42      *

  43      * @param string $cache_dir directory for cache-files

  44      * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited

  45      * @access public

  46      */
  47  	function nusoap_wsdlcache($cache_dir='.', $cache_lifetime=0) {
  48          $this->fplock = array();
  49          $this->cache_dir = $cache_dir != '' ? $cache_dir : '.';
  50          $this->cache_lifetime = $cache_lifetime;
  51      }
  52  
  53      /**

  54      * creates the filename used to cache a wsdl instance

  55      *

  56      * @param string $wsdl The URL of the wsdl instance

  57      * @return string The filename used to cache the instance

  58      * @access private

  59      */
  60  	function createFilename($wsdl) {
  61          return $this->cache_dir.'/wsdlcache-' . md5($wsdl);
  62      }
  63  
  64      /**

  65      * adds debug data to the class level debug string

  66      *

  67      * @param    string $string debug data

  68      * @access   private

  69      */
  70  	function debug($string){
  71          $this->debug_str .= get_class($this).": $string\n";
  72      }
  73  
  74      /**

  75      * gets a wsdl instance from the cache

  76      *

  77      * @param string $wsdl The URL of the wsdl instance

  78      * @return object wsdl The cached wsdl instance, null if the instance is not in the cache

  79      * @access public

  80      */
  81  	function get($wsdl) {
  82          $filename = $this->createFilename($wsdl);
  83          if ($this->obtainMutex($filename, "r")) {
  84              // check for expired WSDL that must be removed from the cache

  85               if ($this->cache_lifetime > 0) {
  86                  if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) {
  87                      unlink($filename);
  88                      $this->debug("Expired $wsdl ($filename) from cache");
  89                      $this->releaseMutex($filename);
  90                      return null;
  91                    }
  92              }
  93              // see what there is to return

  94              if (!file_exists($filename)) {
  95                  $this->debug("$wsdl ($filename) not in cache (1)");
  96                  $this->releaseMutex($filename);
  97                  return null;
  98              }
  99              $fp = @fopen($filename, "r");
 100              if ($fp) {
 101                  $s = implode("", @file($filename));
 102                  fclose($fp);
 103                  $this->debug("Got $wsdl ($filename) from cache");
 104              } else {
 105                  $s = null;
 106                  $this->debug("$wsdl ($filename) not in cache (2)");
 107              }
 108              $this->releaseMutex($filename);
 109              return (!is_null($s)) ? unserialize($s) : null;
 110          } else {
 111              $this->debug("Unable to obtain mutex for $filename in get");
 112          }
 113          return null;
 114      }
 115  
 116      /**

 117      * obtains the local mutex

 118      *

 119      * @param string $filename The Filename of the Cache to lock

 120      * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode

 121      * @return boolean Lock successfully obtained ?!

 122      * @access private

 123      */
 124  	function obtainMutex($filename, $mode) {
 125          if (isset($this->fplock[md5($filename)])) {
 126              $this->debug("Lock for $filename already exists");
 127              return false;
 128          }
 129          $this->fplock[md5($filename)] = fopen($filename.".lock", "w");
 130          if ($mode == "r") {
 131              return flock($this->fplock[md5($filename)], LOCK_SH);
 132          } else {
 133              return flock($this->fplock[md5($filename)], LOCK_EX);
 134          }
 135      }
 136  
 137      /**

 138      * adds a wsdl instance to the cache

 139      *

 140      * @param object wsdl $wsdl_instance The wsdl instance to add

 141      * @return boolean WSDL successfully cached

 142      * @access public

 143      */
 144  	function put($wsdl_instance) {
 145          $filename = $this->createFilename($wsdl_instance->wsdl);
 146          $s = serialize($wsdl_instance);
 147          if ($this->obtainMutex($filename, "w")) {
 148              $fp = fopen($filename, "w");
 149              if (! $fp) {
 150                  $this->debug("Cannot write $wsdl_instance->wsdl ($filename) in cache");
 151                  $this->releaseMutex($filename);
 152                  return false;
 153              }
 154              fputs($fp, $s);
 155              fclose($fp);
 156              $this->debug("Put $wsdl_instance->wsdl ($filename) in cache");
 157              $this->releaseMutex($filename);
 158              return true;
 159          } else {
 160              $this->debug("Unable to obtain mutex for $filename in put");
 161          }
 162          return false;
 163      }
 164  
 165      /**

 166      * releases the local mutex

 167      *

 168      * @param string $filename The Filename of the Cache to lock

 169      * @return boolean Lock successfully released

 170      * @access private

 171      */
 172  	function releaseMutex($filename) {
 173          $ret = flock($this->fplock[md5($filename)], LOCK_UN);
 174          fclose($this->fplock[md5($filename)]);
 175          unset($this->fplock[md5($filename)]);
 176          if (! $ret) {
 177              $this->debug("Not able to release lock for $filename");
 178          }
 179          return $ret;
 180      }
 181  
 182      /**

 183      * removes a wsdl instance from the cache

 184      *

 185      * @param string $wsdl The URL of the wsdl instance

 186      * @return boolean Whether there was an instance to remove

 187      * @access public

 188      */
 189  	function remove($wsdl) {
 190          $filename = $this->createFilename($wsdl);
 191          if (!file_exists($filename)) {
 192              $this->debug("$wsdl ($filename) not in cache to be removed");
 193              return false;
 194          }
 195          // ignore errors obtaining mutex

 196          $this->obtainMutex($filename, "w");
 197          $ret = unlink($filename);
 198          $this->debug("Removed ($ret) $wsdl ($filename) from cache");
 199          $this->releaseMutex($filename);
 200          return $ret;
 201      }
 202  }
 203  
 204  /**

 205   * For backward compatibility

 206   */
 207  class wsdlcache extends nusoap_wsdlcache {
 208  }
 209  ?>


Généré le : Thu Nov 29 09:42:17 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics