Spaces:
Sleeping
Sleeping
| /** | |
| * caches instances of the wsdl class | |
| * | |
| * @author Scott Nichol <snichol@computer.org> | |
| * @author Ingo Fischer <ingo@apollon.de> | |
| * @version $Id: class.wsdlcache.php,v 1.5 2005/05/20 17:58:17 snichol Exp $ | |
| * @access public | |
| */ | |
| class wsdlcache { | |
| /** | |
| * @var resource | |
| * @access private | |
| */ | |
| var $fplock; | |
| /** | |
| * @var integer | |
| * @access private | |
| */ | |
| var $cache_lifetime; | |
| /** | |
| * @var string | |
| * @access private | |
| */ | |
| var $cache_dir; | |
| /** | |
| * @var string | |
| * @access public | |
| */ | |
| var $debug_str = ''; | |
| /** | |
| * constructor | |
| * | |
| * @param string $cache_dir directory for cache-files | |
| * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited | |
| * @access public | |
| */ | |
| function wsdlcache($cache_dir='.', $cache_lifetime=0) { | |
| $this->fplock = array(); | |
| $this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; | |
| $this->cache_lifetime = $cache_lifetime; | |
| } | |
| /** | |
| * creates the filename used to cache a wsdl instance | |
| * | |
| * @param string $wsdl The URL of the wsdl instance | |
| * @return string The filename used to cache the instance | |
| * @access private | |
| */ | |
| function createFilename($wsdl) { | |
| if(!class_exists('G')){ | |
| $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); | |
| $docuroot = explode( '/', $realdocuroot ); | |
| array_pop( $docuroot ); | |
| $pathhome = implode( '/', $docuroot ) . '/'; | |
| array_pop( $docuroot ); | |
| $pathTrunk = implode( '/', $docuroot ) . '/'; | |
| require_once($pathTrunk.'gulliver/system/class.g.php'); | |
| } | |
| return $this->cache_dir.'/wsdlcache-' . G::encryptOld($wsdl); | |
| } | |
| /** | |
| * adds debug data to the class level debug string | |
| * | |
| * @param string $string debug data | |
| * @access private | |
| */ | |
| function debug($string){ | |
| $this->debug_str .= get_class($this).": $string\n"; | |
| } | |
| /** | |
| * gets a wsdl instance from the cache | |
| * | |
| * @param string $wsdl The URL of the wsdl instance | |
| * @return object wsdl The cached wsdl instance, null if the instance is not in the cache | |
| * @access public | |
| */ | |
| function get($wsdl) { | |
| $filename = $this->createFilename($wsdl); | |
| if ($this->obtainMutex($filename, "r")) { | |
| // check for expired WSDL that must be removed from the cache | |
| if ($this->cache_lifetime > 0) { | |
| if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { | |
| unlink($filename); | |
| $this->debug("Expired $wsdl ($filename) from cache"); | |
| $this->releaseMutex($filename); | |
| return null; | |
| } | |
| } | |
| // see what there is to return | |
| $fp = @fopen($filename, "r"); | |
| if ($fp) { | |
| $s = implode("", @file($filename)); | |
| fclose($fp); | |
| $this->debug("Got $wsdl ($filename) from cache"); | |
| } else { | |
| $s = null; | |
| $this->debug("$wsdl ($filename) not in cache"); | |
| } | |
| $this->releaseMutex($filename); | |
| return (!is_null($s)) ? unserialize($s) : null; | |
| } else { | |
| $this->debug("Unable to obtain mutex for $filename in get"); | |
| } | |
| return null; | |
| } | |
| /** | |
| * obtains the local mutex | |
| * | |
| * @param string $filename The Filename of the Cache to lock | |
| * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode | |
| * @return boolean Lock successfully obtained ?! | |
| * @access private | |
| */ | |
| function obtainMutex($filename, $mode) { | |
| if(!class_exists('G')){ | |
| $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); | |
| $docuroot = explode( '/', $realdocuroot ); | |
| array_pop( $docuroot ); | |
| $pathhome = implode( '/', $docuroot ) . '/'; | |
| array_pop( $docuroot ); | |
| $pathTrunk = implode( '/', $docuroot ) . '/'; | |
| require_once($pathTrunk.'gulliver/system/class.g.php'); | |
| } | |
| if (isset($this->fplock[G::encryptOld($filename)])) { | |
| $this->debug("Lock for $filename already exists"); | |
| return false; | |
| } | |
| $this->fplock[G::encryptOld($filename)] = fopen($filename.".lock", "w"); | |
| if ($mode == "r") { | |
| return flock($this->fplock[G::encryptOld($filename)], LOCK_SH); | |
| } else { | |
| return flock($this->fplock[G::encryptOld($filename)], LOCK_EX); | |
| } | |
| } | |
| /** | |
| * adds a wsdl instance to the cache | |
| * | |
| * @param object wsdl $wsdl_instance The wsdl instance to add | |
| * @return boolean WSDL successfully cached | |
| * @access public | |
| */ | |
| function put($wsdl_instance) { | |
| $filename = $this->createFilename($wsdl_instance->wsdl); | |
| $s = serialize($wsdl_instance); | |
| if ($this->obtainMutex($filename, "w")) { | |
| $fp = fopen($filename, "w"); | |
| fputs($fp, $s); | |
| fclose($fp); | |
| $this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); | |
| $this->releaseMutex($filename); | |
| return true; | |
| } else { | |
| $this->debug("Unable to obtain mutex for $filename in put"); | |
| } | |
| return false; | |
| } | |
| /** | |
| * releases the local mutex | |
| * | |
| * @param string $filename The Filename of the Cache to lock | |
| * @return boolean Lock successfully released | |
| * @access private | |
| */ | |
| function releaseMutex($filename) { | |
| if(!class_exists('G')){ | |
| $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); | |
| $docuroot = explode( '/', $realdocuroot ); | |
| array_pop( $docuroot ); | |
| $pathhome = implode( '/', $docuroot ) . '/'; | |
| array_pop( $docuroot ); | |
| $pathTrunk = implode( '/', $docuroot ) . '/'; | |
| require_once($pathTrunk.'gulliver/system/class.g.php'); | |
| } | |
| $ret = flock($this->fplock[G::encryptOld($filename)], LOCK_UN); | |
| fclose($this->fplock[G::encryptOld($filename)]); | |
| unset($this->fplock[G::encryptOld($filename)]); | |
| if (! $ret) { | |
| $this->debug("Not able to release lock for $filename"); | |
| } | |
| return $ret; | |
| } | |
| /** | |
| * removes a wsdl instance from the cache | |
| * | |
| * @param string $wsdl The URL of the wsdl instance | |
| * @return boolean Whether there was an instance to remove | |
| * @access public | |
| */ | |
| function remove($wsdl) { | |
| $filename = $this->createFilename($wsdl); | |
| // ignore errors obtaining mutex | |
| $this->obtainMutex($filename, "w"); | |
| $ret = unlink($filename); | |
| $this->debug("Removed ($ret) $wsdl ($filename) from cache"); | |
| $this->releaseMutex($filename); | |
| return $ret; | |
| } | |
| } | |