source: pro-violet-viettel/www/deploy/20150304/application/libraries/nusoap/class.wsdlcache.php @ 780

Last change on this file since 780 was 780, checked in by dungnv, 10 years ago
File size: 5.5 KB
Line 
1<?php
2/*
3The NuSOAP project home is:
4http://sourceforge.net/projects/nusoap/
5
6The primary support for NuSOAP is the mailing list:
7nusoap-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*/
18class 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 */
207class wsdlcache extends nusoap_wsdlcache {
208}
209?>
Note: See TracBrowser for help on using the repository browser.