[ Index ] |
|
Code source de vtiger CRM 5.0.2 |
1 <?php 2 3 4 5 /** 6 * caches instances of the wsdl class 7 * 8 * @author Scott Nichol <snichol@computer.org> 9 * @author Ingo Fischer <ingo@apollon.de> 10 * @version $Id: class.wsdlcache.php,v 1.5 2005/05/20 17:58:17 snichol Exp $ 11 * @access public 12 */ 13 class wsdlcache { 14 /** 15 * @var resource 16 * @access private 17 */ 18 var $fplock; 19 /** 20 * @var integer 21 * @access private 22 */ 23 var $cache_lifetime; 24 /** 25 * @var string 26 * @access private 27 */ 28 var $cache_dir; 29 /** 30 * @var string 31 * @access public 32 */ 33 var $debug_str = ''; 34 35 /** 36 * constructor 37 * 38 * @param string $cache_dir directory for cache-files 39 * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited 40 * @access public 41 */ 42 function wsdlcache($cache_dir='.', $cache_lifetime=0) { 43 $this->fplock = array(); 44 $this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; 45 $this->cache_lifetime = $cache_lifetime; 46 } 47 48 /** 49 * creates the filename used to cache a wsdl instance 50 * 51 * @param string $wsdl The URL of the wsdl instance 52 * @return string The filename used to cache the instance 53 * @access private 54 */ 55 function createFilename($wsdl) { 56 return $this->cache_dir.'/wsdlcache-' . md5($wsdl); 57 } 58 59 /** 60 * adds debug data to the class level debug string 61 * 62 * @param string $string debug data 63 * @access private 64 */ 65 function debug($string){ 66 $this->debug_str .= get_class($this).": $string\n"; 67 } 68 69 /** 70 * gets a wsdl instance from the cache 71 * 72 * @param string $wsdl The URL of the wsdl instance 73 * @return object wsdl The cached wsdl instance, null if the instance is not in the cache 74 * @access public 75 */ 76 function get($wsdl) { 77 $filename = $this->createFilename($wsdl); 78 if ($this->obtainMutex($filename, "r")) { 79 // check for expired WSDL that must be removed from the cache 80 if ($this->cache_lifetime > 0) { 81 if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { 82 unlink($filename); 83 $this->debug("Expired $wsdl ($filename) from cache"); 84 $this->releaseMutex($filename); 85 return null; 86 } 87 } 88 // see what there is to return 89 $fp = @fopen($filename, "r"); 90 if ($fp) { 91 $s = implode("", @file($filename)); 92 fclose($fp); 93 $this->debug("Got $wsdl ($filename) from cache"); 94 } else { 95 $s = null; 96 $this->debug("$wsdl ($filename) not in cache"); 97 } 98 $this->releaseMutex($filename); 99 return (!is_null($s)) ? unserialize($s) : null; 100 } else { 101 $this->debug("Unable to obtain mutex for $filename in get"); 102 } 103 return null; 104 } 105 106 /** 107 * obtains the local mutex 108 * 109 * @param string $filename The Filename of the Cache to lock 110 * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode 111 * @return boolean Lock successfully obtained ?! 112 * @access private 113 */ 114 function obtainMutex($filename, $mode) { 115 if (isset($this->fplock[md5($filename)])) { 116 $this->debug("Lock for $filename already exists"); 117 return false; 118 } 119 $this->fplock[md5($filename)] = fopen($filename.".lock", "w"); 120 if ($mode == "r") { 121 return flock($this->fplock[md5($filename)], LOCK_SH); 122 } else { 123 return flock($this->fplock[md5($filename)], LOCK_EX); 124 } 125 } 126 127 /** 128 * adds a wsdl instance to the cache 129 * 130 * @param object wsdl $wsdl_instance The wsdl instance to add 131 * @return boolean WSDL successfully cached 132 * @access public 133 */ 134 function put($wsdl_instance) { 135 $filename = $this->createFilename($wsdl_instance->wsdl); 136 $s = serialize($wsdl_instance); 137 if ($this->obtainMutex($filename, "w")) { 138 $fp = fopen($filename, "w"); 139 fputs($fp, $s); 140 fclose($fp); 141 $this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); 142 $this->releaseMutex($filename); 143 return true; 144 } else { 145 $this->debug("Unable to obtain mutex for $filename in put"); 146 } 147 return false; 148 } 149 150 /** 151 * releases the local mutex 152 * 153 * @param string $filename The Filename of the Cache to lock 154 * @return boolean Lock successfully released 155 * @access private 156 */ 157 function releaseMutex($filename) { 158 $ret = flock($this->fplock[md5($filename)], LOCK_UN); 159 fclose($this->fplock[md5($filename)]); 160 unset($this->fplock[md5($filename)]); 161 if (! $ret) { 162 $this->debug("Not able to release lock for $filename"); 163 } 164 return $ret; 165 } 166 167 /** 168 * removes a wsdl instance from the cache 169 * 170 * @param string $wsdl The URL of the wsdl instance 171 * @return boolean Whether there was an instance to remove 172 * @access public 173 */ 174 function remove($wsdl) { 175 $filename = $this->createFilename($wsdl); 176 // ignore errors obtaining mutex 177 $this->obtainMutex($filename, "w"); 178 $ret = unlink($filename); 179 $this->debug("Removed ($ret) $wsdl ($filename) from cache"); 180 $this->releaseMutex($filename); 181 return $ret; 182 } 183 } 184 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 10:22:19 2007 | par Balluche grâce à PHPXref 0.7 |