PageRenderTime 26ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 1ms

/inc/cache.inc.php

https://github.com/kaasius/zabbix-cms
PHP | 286 lines | 261 code | 21 blank | 4 comment | 65 complexity | a3baa090818a77994b4899545bf176cd MD5 | raw file
  1. <?
  2. require_once ("$_SERVER[DOCUMENT_ROOT]/config.inc.php");
  3. //require_once ("$inc_path/log.inc.php");
  4. /*ATTENTION! Do not change this section, if you want to redefine default
  5. constants - do it in config.inc.php*/
  6. if(!defined('KEY_PREFIX')) define ("KEY_PREFIX",$_SERVER['HTTP_HOST']);
  7. if(!defined('CACHE_DIR')) define ("CACHE_DIR",$_SERVER['DOCUMENT_ROOT']."/cache/");
  8. if(!defined('STATIC_CACHE_DIR')) define ("STATIC_CACHE_DIR",$_SERVER['DOCUMENT_ROOT']."/static_cache/");
  9. if(!defined('MEMCACHE_ENABLE')) define("MEMCACHE_ENABLE","NO");
  10. if(!defined('DEBUG_MODE')) define("DEBUG_MODE",false);
  11. if(!defined('CACHE_TAGS_FILE')) define('CACHE_TAGS_FILE',CACHE_DIR."_TAGS_");
  12. if(!defined('MEMCACHE_DEFAULT_HOST')) define('MEMCACHE_DEFAULT_HOST',"localhost");
  13. if(!defined('MEMCACHE_DEFAULT_PORT')) define('MEMCACHE_DEFAULT_PORT',11211);
  14. function mkdir_recursive($pathname)
  15. {
  16. is_dir(dirname($pathname)) || mkdir_recursive(dirname($pathname));
  17. return is_dir($pathname) || @mkdir($pathname);
  18. }
  19. function cache_connect()
  20. {
  21. global $_MEMCACHE_SERVERS_;
  22. static $channel;
  23. if($channel) return($channel);
  24. $channel=memcache_connect(MEMCACHE_DEFAULT_HOST, MEMCACHE_DEFAULT_HOST);
  25. if(is_array($_MWMCACHE_SERVERS_))
  26. foreach ($_MWMCACHE_SERVERS_ as $key=>$val)
  27. memcache_add_server($channel, $key,$val);
  28. return($channel);
  29. }
  30. function normalize_path($str)
  31. {
  32. if($str=="/" or (!$str)) return ("/index.htm?");
  33. $pathinfo=pathinfo($str);
  34. if(!$pathinfo[basename]) return($str."/index.htm?");
  35. // if(!$pathinfo[extension]) return($str."?");
  36. return($str."?");
  37. }
  38. function set_static_cache($key,$value,$tags="")
  39. {
  40. if(USE_CACHE=="NO") return("");
  41. $key=normalize_path($key);
  42. $cachefile=str_replace("//","/",STATIC_CACHE_DIR . $key);
  43. if(!@file_put_contents($cachefile,$value))
  44. {
  45. if(!mkdir_recursive(dirname($cachefile)))
  46. {
  47. cache_error("Не могу сохранить кеш в $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  48. return(0);
  49. }
  50. if(!@file_put_contents($cachefile,$value))
  51. {
  52. cache_error("Не могу сохранить кеш в $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  53. return(0);
  54. }
  55. }
  56. }
  57. function get_static_cache($key)
  58. {
  59. if(USE_CACHE=="NO") return("");
  60. $key=normalize_path($key);
  61. $cachefile=str_replace("//","/",STATIC_CACHE_DIR . $key);
  62. return(@file_get_contents($cachefile));
  63. }
  64. function delete_static_cache($key)
  65. {
  66. if(USE_CACHE=="NO") return("");
  67. $key=normalize_path($key);
  68. $cachefile=str_replace("//","/",STATIC_CACHE_DIR . $key);
  69. if(!@file_exists($cachefile)) return(true);
  70. if(!@unlink($cachefile))
  71. {
  72. cache_error("Не могу удалить файл $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  73. return (false);
  74. }
  75. return(true);
  76. }
  77. function get_cache($key)
  78. {
  79. if(USE_CACHE=="NO") return("");
  80. if(MEMCACHE_ENABLE=="YES" && function_exists("memcache_connect"))
  81. {
  82. if(!$connection=cache_connect())
  83. {
  84. cache_error("Не могу подключиться к memcached, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  85. return ("");
  86. }
  87. return(memcache_get($connection,KEY_PREFIX . $key));
  88. }
  89. else
  90. {
  91. $key=normalize_path($key);
  92. $cachefile=str_replace("//","/",CACHE_DIR . $key);
  93. if($t=@filemtime($cachefile)!=0 && $t<time()) return("");
  94. $temp=unserialize(@file_get_contents($cachefile));
  95. return ($temp);
  96. }
  97. }
  98. function set_cache($key,$value,$tags="",$time=0)
  99. {
  100. if(USE_CACHE=="NO") return("");
  101. if(MEMCACHE_ENABLE=="YES" && function_exists("memcache_connect"))
  102. {
  103. if(!$connection=cache_connect())
  104. {
  105. cache_error("Не могу подключиться к memcached, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  106. return ("");
  107. }
  108. if(!memcache_set($connection,$key,$value,0,$time))
  109. {
  110. cache_error("Не могу сохранить кеш в memcached, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  111. return(0);
  112. }
  113. }
  114. else
  115. {
  116. $key=normalize_path($key);
  117. $cachefile=str_replace("//","/",CACHE_DIR . $key);
  118. if(!@file_put_contents($cachefile,serialize($value)))
  119. {
  120. if(!mkdir_recursive(dirname($cachefile)))
  121. {
  122. cache_error("Не могу сохранить кеш в $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  123. return(0);
  124. }
  125. if(!@file_put_contents($cachefile,serialize($value)))
  126. {
  127. cache_error("Не могу сохранить кеш в $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  128. return(0);
  129. }
  130. }
  131. if(!$time)
  132. @touch($cachefile,0);
  133. else
  134. @touch($cachefile,time()+$time);
  135. }
  136. if($tags)
  137. if(!add_tags($key,is_array($tags)?$tags:@explode(",",$tags)))
  138. {
  139. cache_error("Не могу сохранить теги для ключа $key, кеш удален, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  140. delete_cache($key);
  141. return(0);
  142. }
  143. }
  144. function delete_cache($key)
  145. {
  146. if(USE_CACHE=="NO") return("");
  147. if(MEMCACHE_ENABLE=="YES" && function_exists("memcache_connect"))
  148. {
  149. if(!$connection=cache_connect())
  150. {
  151. cache_error("Не могу подключиться к memcached, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  152. return (false);
  153. }
  154. return(memcache_delete($connection,KEY_PREFIX . $key));
  155. }
  156. else
  157. {
  158. $key=normalize_path($key);
  159. $cachefile=str_replace("//","/",CACHE_DIR . $key);
  160. if(!@file_exists($cachefile)) return(true);
  161. if(!@unlink($cachefile))
  162. {
  163. cache_error("Не могу удалить файл $cachefile, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  164. return (false);
  165. }
  166. return ("");
  167. }
  168. }
  169. function get_tags()
  170. {
  171. $oldtags=array();
  172. while((!@rename(CACHE_TAGS_FILE,CACHE_DIR."_TEMPTAGS_")) and $i<1000)
  173. {
  174. if(!file_exists(CACHE_DIR."_TEMPTAGS_"))
  175. {
  176. cache_error ("Теги отсутствуют, создайте файл ".CACHE_TAGS_FILE." и разрешите в него запись для всех, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  177. return(false);
  178. }
  179. $i++;
  180. usleep(100);
  181. }
  182. if($i>=1000)
  183. {
  184. cache_error ("deadlock, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  185. return(false);
  186. }
  187. $oldtags=unserialize(@file_get_contents(CACHE_DIR."_TEMPTAGS_"));
  188. if($oldtags && (!@is_array($oldtags)))
  189. {
  190. cache_error("Неверные данные в структуре тегов, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  191. if(!@rename(CACHE_DIR."_TEMPTAGS_",CACHE_TAGS_FILE)) cache_error ("deadlock, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  192. return(false);
  193. }
  194. if(!$oldtags)$oldtags=array();
  195. return($oldtags);
  196. }
  197. function put_tags($tags)
  198. {
  199. if(!file_put_contents(CACHE_TAGS_FILE,serialize($tags)))
  200. {
  201. cache_error("Не могу записать теги, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  202. return(false);
  203. }
  204. @unlink(CACHE_DIR."_TEMPTAGS_");
  205. }
  206. function restore_tags()
  207. {
  208. if(!@rename(CACHE_DIR."_TEMPTAGS_",CACHE_TAGS_FILE))
  209. {
  210. cache_error("Не могу восстановить теги, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  211. return(false);
  212. }
  213. }
  214. function add_tags($key,$tags)
  215. {
  216. if(!$tags) return(true);
  217. if(!is_array($tags))$tags=array($tags);
  218. if(($oldtags=get_tags())===false)
  219. {
  220. cache_error("Ошибка чтения тегов, файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  221. restore_tags();
  222. return(false);
  223. }
  224. for($i=0;$i<@count($tags);$i++)
  225. {
  226. $oldtags[$tags[$i]][]=$key;
  227. $oldtags[$tags[$i]]=@array_unique($oldtags[$tags[$i]]);
  228. }
  229. put_tags($oldtags);
  230. return(true);
  231. }
  232. function delete_tags($tags,$static=0)
  233. {
  234. if(!$tags) return(true);
  235. if(!is_array($tags))$tags=array($tags);
  236. if($oldtags=get_tags()===false) return(false);
  237. for($i=0;$i<@count($oldtags);$i++)
  238. {
  239. $delete=$oldtags[$i];
  240. $notdeleted=array();
  241. for($j=0;$j<@count($delete);$j++)
  242. {
  243. if(!delete_cache($delete[$j]))
  244. {
  245. cache_error("Не могу удалить тег $delete[$j], файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  246. $notdeleted[]=$delete[$j];
  247. }
  248. if(!delete_static_cache($delete[$j]))
  249. {
  250. cache_error("Не могу удалить тег $delete[$j], файл ".__FILE__.", строка ".__LINE__.", функция ".__FUNCTION__);
  251. $notdeleted[]=$delete[$j];
  252. }
  253. }
  254. $oldtags[$i]=$notdeleted;
  255. }
  256. put_tags($oldtags);
  257. return(true);
  258. }
  259. function cache_error($str)
  260. {
  261. if(DEBUG_MODE)
  262. logging("cache_errors",$str);
  263. return(1);
  264. }
  265. ?>