You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							160 lines
						
					
					
						
							4.1 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								* 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.1 2004/08/17 13:27:46 gjayakrishnan Exp $
							 | 
						|
								* @access public 
							 | 
						|
								*/
							 | 
						|
								class wsdlcache {
							 | 
						|
									var $fplock;
							 | 
						|
									var $cache_lifetime;
							 | 
						|
									var $cache_dir;
							 | 
						|
									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 protected
							 | 
						|
									*/
							 | 
						|
									function createFilename($wsdl) {
							 | 
						|
										return $this->cache_dir.'/wsdlcache-' . md5($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 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;
							 | 
						|
										}
							 | 
						|
										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 protected
							 | 
						|
									*/
							 | 
						|
									function obtainMutex($filename, $mode) {
							 | 
						|
										if (isset($this->fplock[md5($filename)])) {
							 | 
						|
											$this->debug("Lock for $filename already exists");
							 | 
						|
											return false;
							 | 
						|
										}
							 | 
						|
										$this->fplock[md5($filename)] = fopen($filename.".lock", "w");
							 | 
						|
										if ($mode == "r") {
							 | 
						|
											return flock($this->fplock[md5($filename)], LOCK_SH);
							 | 
						|
										} else {
							 | 
						|
											return flock($this->fplock[md5($filename)], LOCK_EX);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									/*
							 | 
						|
									* adds a wsdl instance to the cache
							 | 
						|
									*
							 | 
						|
									* @param object $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;
							 | 
						|
										}
							 | 
						|
										return false;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									/**
							 | 
						|
									* releases the local mutex
							 | 
						|
									*
							 | 
						|
									* @param string $filename The Filename of the Cache to lock
							 | 
						|
									* @return boolean Lock successfully released
							 | 
						|
									* @access protected
							 | 
						|
									*/
							 | 
						|
									function releaseMutex($filename) {
							 | 
						|
										$ret = flock($this->fplock[md5($filename)], LOCK_UN);
							 | 
						|
										fclose($this->fplock[md5($filename)]);
							 | 
						|
										unset($this->fplock[md5($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);
							 | 
						|
										$this->obtainMutex($filename, "w");
							 | 
						|
										$ret = unlink($filename);
							 | 
						|
										$this->debug("Removed $wsdl ($filename) from cache");
							 | 
						|
										$this->releaseMutex($filename);
							 | 
						|
										return $ret;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								?>
							 | 
						|
								
							 |