shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

class.wsdlcache.php (5381B)


      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 ?>