123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- <?php
- /*
- The NuSOAP project home is:
- http://sourceforge.net/projects/nusoap/
- The primary support for NuSOAP is the mailing list:
- nusoap-general@lists.sourceforge.net
- */
- /**
- * caches instances of the wsdl class
- *
- * @author Scott Nichol <snichol@users.sourceforge.net>
- * @author Ingo Fischer <ingo@apollon.de>
- * @version $Id: class.wsdlcache.php,v 1.7 2007/04/17 16:34:03 snichol Exp $
- * @access public
- */
- class nusoap_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 nusoap_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) {
- 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 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
- if (!file_exists($filename)) {
- $this->debug("$wsdl ($filename) not in cache (1)");
- $this->releaseMutex($filename);
- return null;
- }
- $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 (2)");
- }
- $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 (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 $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");
- if (! $fp) {
- $this->debug("Cannot write $wsdl_instance->wsdl ($filename) in cache");
- $this->releaseMutex($filename);
- return false;
- }
- 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) {
- $ret = flock($this->fplock[md5($filename)], LOCK_UN);
- fclose($this->fplock[md5($filename)]);
- unset($this->fplock[md5($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);
- if (!file_exists($filename)) {
- $this->debug("$wsdl ($filename) not in cache to be removed");
- return false;
- }
- // ignore errors obtaining mutex
- $this->obtainMutex($filename, "w");
- $ret = unlink($filename);
- $this->debug("Removed ($ret) $wsdl ($filename) from cache");
- $this->releaseMutex($filename);
- return $ret;
- }
- }
- /**
- * For backward compatibility
- */
- class wsdlcache extends nusoap_wsdlcache {
- }
- ?>
|