table_common_syscache.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: table_common_syscache.php 31119 2012-07-18 04:21:20Z zhangguosheng $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class table_common_syscache extends discuz_table
  12. {
  13. private $_isfilecache;
  14. public function __construct() {
  15. $this->_table = 'common_syscache';
  16. $this->_pk = 'cname';
  17. $this->_pre_cache_key = '';
  18. $this->_isfilecache = getglobal('config/cache/type') == 'file';
  19. $this->_allowmem = memory('check');
  20. parent::__construct();
  21. }
  22. public function fetch($cachename) {
  23. $data = $this->fetch_all(array($cachename));
  24. return isset($data[$cachename]) ? $data[$cachename] : false;
  25. }
  26. public function fetch_all($cachenames) {
  27. $data = array();
  28. $cachenames = is_array($cachenames) ? $cachenames : array($cachenames);
  29. if($this->_allowmem) {
  30. $data = memory('get', $cachenames);
  31. $newarray = $data !== false ? array_diff($cachenames, array_keys($data)) : $cachenames;
  32. if(empty($newarray)) {
  33. return $data;
  34. } else {
  35. $cachenames = $newarray;
  36. }
  37. }
  38. if($this->_isfilecache) {
  39. $lostcaches = array();
  40. foreach($cachenames as $cachename) {
  41. if(!@include_once(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php')) {
  42. $lostcaches[] = $cachename;
  43. } elseif($this->_allowmem) {
  44. memory('set', $cachename, $data[$cachename]);
  45. }
  46. }
  47. if(!$lostcaches) {
  48. return $data;
  49. }
  50. $cachenames = $lostcaches;
  51. unset($lostcaches);
  52. }
  53. $query = DB::query('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('cname', $cachenames));
  54. while($syscache = DB::fetch($query)) {
  55. $data[$syscache['cname']] = $syscache['ctype'] ? unserialize($syscache['data']) : $syscache['data'];
  56. $this->_allowmem && (memory('set', $syscache['cname'], $data[$syscache['cname']]));
  57. if($this->_isfilecache) {
  58. $cachedata = '$data[\''.$syscache['cname'].'\'] = '.var_export($data[$syscache['cname']], true).";\n\n";
  59. if(($fp = @fopen(DISCUZ_ROOT.'./data/cache/cache_'.$syscache['cname'].'.php', 'wb'))) {
  60. fwrite($fp, "<?php\n//Discuz! cache file, DO NOT modify me!\n//Identify: ".md5($syscache['cname'].$cachedata.getglobal('config/security/authkey'))."\n\n$cachedata?>");
  61. fclose($fp);
  62. }
  63. }
  64. }
  65. foreach($cachenames as $name) {
  66. if($data[$name] === null) {
  67. $data[$name] = null;
  68. $this->_allowmem && (memory('set', $name, array()));
  69. }
  70. }
  71. return $data;
  72. }
  73. public function insert($cachename, $data) {
  74. parent::insert(array(
  75. 'cname' => $cachename,
  76. 'ctype' => is_array($data) ? 1 : 0,
  77. 'dateline' => TIMESTAMP,
  78. 'data' => is_array($data) ? serialize($data) : $data,
  79. ), false, true);
  80. if($this->_allowmem && memory('get', $cachename) !== false) {
  81. memory('set', $cachename, $data);
  82. }
  83. $this->_isfilecache && @unlink(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php');
  84. }
  85. public function update($cachename, $data) {
  86. $this->insert($cachename, $data);
  87. }
  88. public function delete($cachenames) {
  89. parent::delete($cachenames);
  90. if($this->_allowmem || $this->_isfilecache) {
  91. foreach((array)$cachenames as $cachename) {
  92. $this->_allowmem && memory('rm', $cachename);
  93. $this->_isfilecache && @unlink(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php');
  94. }
  95. }
  96. }
  97. }
  98. ?>