cache_api.class.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. <?php
  2. /**
  3. *
  4. * 更新缓存类
  5. *
  6. */
  7. defined('IN_PHPCMS') or exit('No permission resources.');
  8. class cache_api {
  9. private $db;
  10. public function __construct() {
  11. $this->db = '';
  12. $this->siteid = get_siteid();
  13. }
  14. /**
  15. * 更新缓存
  16. * @param string $model 方法名
  17. * @param string $param 参数
  18. */
  19. public function cache($model = '', $param = '') {
  20. if (file_exists(PC_PATH.'model'.DIRECTORY_SEPARATOR.$model.'_model.class.php')) {
  21. $this->db = pc_base::load_model($model.'_model');
  22. if ($param) {
  23. $this->$model($param);
  24. } else {
  25. $this->$model();
  26. }
  27. } else {
  28. $this->$model();
  29. }
  30. }
  31. /**
  32. * 更新站点缓存方法
  33. */
  34. public function cache_site() {
  35. $site = pc_base::load_app_class('sites', 'admin');
  36. $site->set_cache();
  37. }
  38. /**
  39. * 更新栏目缓存方法
  40. */
  41. public function category() {
  42. $categorys = array();
  43. $models = getcache('model','commons');
  44. if (is_array($models)) {
  45. foreach ($models as $modelid=>$model) {
  46. $datas = $this->db->select(array('modelid'=>$modelid),'catid,type,items',10000);
  47. $array = array();
  48. foreach ($datas as $r) {
  49. if($r['type']==0) $array[$r['catid']] = $r['items'];
  50. }
  51. setcache('category_items_'.$modelid, $array,'commons');
  52. }
  53. }
  54. $array = array();
  55. $categorys = $this->db->select('`module`=\'content\'','catid,siteid',20000,'listorder ASC');
  56. foreach ($categorys as $r) {
  57. $array[$r['catid']] = $r['siteid'];
  58. }
  59. setcache('category_content',$array,'commons');
  60. $categorys = $this->categorys = array();
  61. $this->categorys = $this->db->select(array('siteid'=>$this->siteid, 'module'=>'content'),'*',10000,'listorder ASC');
  62. foreach($this->categorys as $r) {
  63. unset($r['module']);
  64. $setting = string2array($r['setting']);
  65. $r['create_to_html_root'] = $setting['create_to_html_root'];
  66. $r['ishtml'] = $setting['ishtml'];
  67. $r['content_ishtml'] = $setting['content_ishtml'];
  68. $r['category_ruleid'] = $setting['category_ruleid'];
  69. $r['show_ruleid'] = $setting['show_ruleid'];
  70. $r['workflowid'] = $setting['workflowid'];
  71. $r['isdomain'] = '0';
  72. if(!preg_match('/^(http|https):\/\//', $r['url'])) {
  73. $r['url'] = siteurl($r['siteid']).$r['url'];
  74. } elseif ($r['ishtml']) {
  75. $r['isdomain'] = '1';
  76. }
  77. $categorys[$r['catid']] = $r;
  78. }
  79. setcache('category_content_'.$this->siteid,$categorys,'commons');
  80. return true;
  81. }
  82. /**
  83. * 更新下载服务器缓存方法
  84. */
  85. public function downservers () {
  86. $infos = $this->db->select();
  87. foreach ($infos as $info){
  88. $servers[$info['id']] = $info;
  89. }
  90. setcache('downservers', $servers,'commons');
  91. return $infos;
  92. }
  93. /**
  94. * 更新敏感词缓存方法
  95. */
  96. public function badword() {
  97. $infos = $this->db->select('','badid,badword,replaceword,level','','badid ASC');
  98. setcache('badword', $infos, 'commons');
  99. return true;
  100. }
  101. /**
  102. * 更新ip禁止缓存方法
  103. */
  104. public function ipbanned() {
  105. $infos = $this->db->select('', '`ip`,`expires`', '', 'ipbannedid desc');
  106. setcache('ipbanned', $infos, 'commons');
  107. return true;
  108. }
  109. /**
  110. * 更新关联链接缓存方法
  111. */
  112. public function keylink() {
  113. $infos = $this->db->select('','word,url','','keylinkid ASC');
  114. $datas = $rs = array();
  115. foreach($infos as $r) {
  116. $rs[0] = $r['word'];
  117. $rs[1] = $r['url'];
  118. $datas[] = $rs;
  119. }
  120. setcache('keylink', $datas, 'commons');
  121. return true;
  122. }
  123. /**
  124. * 更新联动菜单缓存方法
  125. */
  126. public function linkage() {
  127. $infos = $this->db->select(array('keyid'=>0));
  128. foreach ($infos as $r) {
  129. $linkageid = intval($r['linkageid']);
  130. $r = $this->db->get_one(array('linkageid'=>$linkageid),'name,siteid,style');
  131. $info['title'] = $r['name'];
  132. $info['style'] = $r['style'];
  133. $info['siteid'] = $r['siteid'];
  134. $info['data'] = $this->submenulist($linkageid);
  135. setcache($linkageid, $info,'linkage');
  136. }
  137. return true;
  138. }
  139. /**
  140. * 子菜单列表
  141. * @param intval $keyid 菜单id
  142. */
  143. public function submenulist($keyid=0) {
  144. $keyid = intval($keyid);
  145. $datas = array();
  146. $where = ($keyid > 0) ? array('keyid'=>$keyid) : '';
  147. $result = $this->db->select($where,'*','','listorder ,linkageid');
  148. foreach($result as $r) {
  149. $datas[$r['linkageid']] = $r;
  150. }
  151. return $datas;
  152. }
  153. /**
  154. * 更新推荐位缓存方法
  155. */
  156. public function position () {
  157. $infos = $this->db->select('','*',1000,'listorder DESC');
  158. foreach ($infos as $info){
  159. $positions[$info['posid']] = $info;
  160. }
  161. setcache('position', $positions,'commons');
  162. return $infos;
  163. }
  164. /**
  165. * 更新投票配置
  166. */
  167. public function vote_setting() {
  168. $m_db = pc_base::load_model('module_model');
  169. $data = $m_db->select(array('module'=>'vote'));
  170. $setting = string2array($data[0]['setting']);
  171. setcache('vote', $setting, 'commons');
  172. }
  173. /**
  174. * 更新友情链接配置
  175. */
  176. public function link_setting() {
  177. $m_db = pc_base::load_model('module_model');
  178. $data = $m_db->select(array('module'=>'link'));
  179. $setting = string2array($data[0]['setting']);
  180. setcache('link', $setting, 'commons');
  181. }
  182. /**
  183. * 更新管理员角色缓存方法
  184. */
  185. public function admin_role() {
  186. $infos = $this->db->select(array('disabled'=>'0'), $data = '`roleid`,`rolename`', '', 'roleid ASC');
  187. foreach ($infos as $info){
  188. $role[$info['roleid']] = $info['rolename'];
  189. }
  190. $this->cache_siteid($role);
  191. setcache('role', $role,'commons');
  192. return $infos;
  193. }
  194. /**
  195. * 更新管理员角色缓存方法
  196. */
  197. public function cache_siteid($role) {
  198. $priv_db = pc_base::load_model('admin_role_priv_model');
  199. $sitelist = array();
  200. foreach($role as $n=>$r) {
  201. $sitelists = $priv_db->select(array('roleid'=>$n),'siteid', '', 'siteid');
  202. foreach($sitelists as $site) {
  203. foreach($site as $v){
  204. $sitelist[$n][] = intval($v);
  205. }
  206. }
  207. }
  208. $sitelist = @array_map("array_unique", $sitelist);
  209. setcache('role_siteid', $sitelist,'commons');
  210. return $sitelist;
  211. }
  212. /**
  213. * 更新url规则缓存方法
  214. */
  215. public function urlrule() {
  216. $datas = $this->db->select('','*','','','','urlruleid');
  217. $basic_data = array();
  218. foreach($datas as $roleid=>$r) {
  219. $basic_data[$roleid] = $r['urlrule'];;
  220. }
  221. setcache('urlrules_detail',$datas,'commons');
  222. setcache('urlrules',$basic_data,'commons');
  223. }
  224. /**
  225. * 更新模块缓存方法
  226. */
  227. public function module() {
  228. $modules = array();
  229. $modules = $this->db->select(array('disabled'=>0), '*', '', '', '', 'module');
  230. setcache('modules', $modules, 'commons');
  231. return true;
  232. }
  233. /**
  234. * 更新模型缓存方法
  235. */
  236. public function sitemodel() {
  237. define('MODEL_PATH', PC_PATH.'modules'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR);
  238. define('CACHE_MODEL_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR);
  239. require MODEL_PATH.'fields.inc.php';
  240. //更新内容模型类:表单生成、入库、更新、输出
  241. $classtypes = array('form','input','update','output');
  242. foreach($classtypes as $classtype) {
  243. $cache_data = file_get_contents(MODEL_PATH.'content_'.$classtype.'.class.php');
  244. $cache_data = str_replace('}?>','',$cache_data);
  245. foreach($fields as $field=>$fieldvalue) {
  246. if(file_exists(MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php')) {
  247. $cache_data .= file_get_contents(MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php');
  248. }
  249. }
  250. $cache_data .= "\r\n } \r\n?>";
  251. file_put_contents(CACHE_MODEL_PATH.'content_'.$classtype.'.class.php',$cache_data);
  252. chmod(CACHE_MODEL_PATH.'content_'.$classtype.'.class.php',0777);
  253. }
  254. //更新模型数据缓存
  255. $model_array = array();
  256. $datas = $this->db->select(array('type'=>0));
  257. foreach ($datas as $r) {
  258. $model_array[$r['modelid']] = $r;
  259. $this->sitemodel_field($r['modelid']);
  260. }
  261. setcache('model', $model_array, 'commons');
  262. return true;
  263. }
  264. /**
  265. * 更新模型字段缓存方法
  266. */
  267. public function sitemodel_field($modelid) {
  268. $field_array = array();
  269. $db = pc_base::load_model('sitemodel_field_model');
  270. $fields = $db->select(array('modelid'=>$modelid,'disabled'=>0),'*',100,'listorder ASC');
  271. foreach($fields as $_value) {
  272. $setting = string2array($_value['setting']);
  273. $_value = array_merge($_value,$setting);
  274. $field_array[$_value['field']] = $_value;
  275. }
  276. setcache('model_field_'.$modelid,$field_array,'model');
  277. return true;
  278. }
  279. /**
  280. * 更新类别缓存方法
  281. */
  282. public function type($param = '') {
  283. $datas = array();
  284. $result_datas = $this->db->select(array('siteid'=>get_siteid(),'module'=>$param),'*',1000,'listorder ASC,typeid ASC');
  285. foreach($result_datas as $_key=>$_value) {
  286. $datas[$_value['typeid']] = $_value;
  287. }
  288. if ($param=='search') {
  289. $this->search_type();
  290. } else {
  291. setcache('type_'.$param, $datas, 'commons');
  292. }
  293. return true;
  294. }
  295. /**
  296. * 更新工作流缓存方法
  297. */
  298. public function workflow() {
  299. $datas = array();
  300. $workflow_datas = $this->db->select(array('siteid'=>get_siteid()),'*',1000);
  301. foreach($workflow_datas as $_k=>$_v) {
  302. $datas[$_v['workflowid']] = $_v;
  303. }
  304. setcache('workflow_'.get_siteid(),$datas,'commons');
  305. return true;
  306. }
  307. /**
  308. * 更新数据源缓存方法
  309. */
  310. public function dbsource() {
  311. $db = pc_base::load_model('dbsource_model');
  312. $list = $db->select();
  313. $data = array();
  314. if ($list) {
  315. foreach ($list as $val) {
  316. $data[$val['name']] = array('hostname'=>$val['host'].':'.$val['port'], 'database' =>$val['dbname'] , 'db_tablepre'=>$val['dbtablepre'], 'username' =>$val['username'],'password' => $val['password'],'charset'=>$val['charset'],'debug'=>0,'pconnect'=>0,'autoconnect'=>0);
  317. }
  318. } else {
  319. return false;
  320. }
  321. return setcache('dbsource', $data, 'commons');
  322. }
  323. /**
  324. * 更新会员组缓存方法
  325. */
  326. public function member_group() {
  327. $grouplist = $this->db->listinfo('', '', 1, 100, 'groupid');
  328. setcache('grouplist', $grouplist,'member');
  329. return true;
  330. }
  331. /**
  332. * 更新会员配置缓存方法
  333. */
  334. public function member_setting() {
  335. $this->db = pc_base::load_model('module_model');
  336. $member_setting = $this->db->get_one(array('module'=>'member'), 'setting');
  337. $member_setting = string2array($member_setting['setting']);
  338. setcache('member_setting', $member_setting, 'member');
  339. return true;
  340. }
  341. /**
  342. * 更新会员模型缓存方法
  343. */
  344. public function membermodel() {
  345. define('MEMBER_MODEL_PATH',PC_PATH.'modules'.DIRECTORY_SEPARATOR.'member'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR);
  346. //模型缓存路径
  347. define('MEMBER_CACHE_MODEL_PATH',PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR);
  348. $sitemodel_db = pc_base::load_model('sitemodel_model');
  349. $data = $sitemodel_db->select(array('type'=>2), "*", 1000, 'sort', '', 'modelid');
  350. setcache('member_model', $data, 'commons');
  351. require MEMBER_MODEL_PATH.'fields.inc.php';
  352. //更新内容模型类:表单生成、入库、更新、输出
  353. $classtypes = array('form','input','update','output');
  354. foreach($classtypes as $classtype) {
  355. $cache_data = file_get_contents(MEMBER_MODEL_PATH.'member_'.$classtype.'.class.php');
  356. $cache_data = str_replace('}?>','',$cache_data);
  357. foreach($fields as $field=>$fieldvalue) {
  358. if(file_exists(MEMBER_MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php')) {
  359. $cache_data .= file_get_contents(MEMBER_MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php');
  360. }
  361. }
  362. $cache_data .= "\r\n } \r\n?>";
  363. file_put_contents(MEMBER_CACHE_MODEL_PATH.'member_'.$classtype.'.class.php',$cache_data);
  364. chmod(MEMBER_CACHE_MODEL_PATH.'member_'.$classtype.'.class.php',0777);
  365. }
  366. return true;
  367. }
  368. /**
  369. * 更新会员模型字段缓存方法
  370. */
  371. public function member_model_field() {
  372. $member_model = getcache('member_model', 'commons');
  373. $this->db = pc_base::load_model('sitemodel_field_model');
  374. foreach ($member_model as $modelid => $m) {
  375. $field_array = array();
  376. $fields = $this->db->select(array('modelid'=>$modelid,'disabled'=>0),'*',100,'listorder ASC');
  377. foreach($fields as $_value) {
  378. $setting = string2array($_value['setting']);
  379. $_value = array_merge($_value,$setting);
  380. $field_array[$_value['field']] = $_value;
  381. }
  382. setcache('model_field_'.$modelid,$field_array,'model');
  383. }
  384. return true;
  385. }
  386. /**
  387. * 更新搜索配置缓存方法
  388. */
  389. public function search_setting() {
  390. $this->db = pc_base::load_model('module_model');
  391. $setting = $this->db->get_one(array('module'=>'search'), 'setting');
  392. $setting = string2array($setting['setting']);
  393. setcache('search', $setting, 'search');
  394. return true;
  395. }
  396. /**
  397. * 更新搜索类型缓存方法
  398. */
  399. public function search_type() {
  400. $sitelist = getcache('sitelist','commons');
  401. foreach ($sitelist as $siteid=>$_v) {
  402. $datas = $search_model = array();
  403. $result_datas = $result_datas2 = $this->db->select(array('siteid'=>$siteid,'module'=>'search'),'*',1000,'listorder ASC');
  404. foreach($result_datas as $_key=>$_value) {
  405. if(!$_value['modelid']) continue;
  406. $datas[$_value['modelid']] = $_value['typeid'];
  407. $search_model[$_value['modelid']]['typeid'] = $_value['typeid'];
  408. $search_model[$_value['modelid']]['name'] = $_value['name'];
  409. $search_model[$_value['modelid']]['sort'] = $_value['listorder'];
  410. }
  411. setcache('type_model_'.$siteid,$datas,'search');
  412. $datas = array();
  413. foreach($result_datas2 as $_key=>$_value) {
  414. if($_value['modelid']) continue;
  415. $datas[$_value['typedir']] = $_value['typeid'];
  416. $search_model[$_value['typedir']]['typeid'] = $_value['typeid'];
  417. $search_model[$_value['typedir']]['name'] = $_value['name'];
  418. }
  419. setcache('type_module_'.$siteid,$datas,'search');
  420. //搜索header头中使用类型缓存
  421. setcache('search_model_'.$siteid,$search_model,'search');
  422. }
  423. return true;
  424. }
  425. /**
  426. * 更新专题缓存方法
  427. */
  428. public function special() {
  429. $specials = array();
  430. $result = $this->db->select(array('disabled'=>0), '`id`, `siteid`, `title`, `url`, `thumb`, `banner`, `ishtml`', '', '`listorder` DESC, `id` DESC');
  431. foreach($result as $r) {
  432. $specials[$r['id']] = $r;
  433. }
  434. setcache('special', $specials, 'commons');
  435. return true;
  436. }
  437. /**
  438. * 更新网站配置方法
  439. */
  440. public function setting() {
  441. $this->db = pc_base::load_model('module_model');
  442. $result = $this->db->get_one(array('module'=>'admin'));
  443. $setting = string2array($result['setting']);
  444. setcache('common', $setting,'commons');
  445. return true;
  446. }
  447. /**
  448. * 更新数据源模型缓存方法
  449. */
  450. public function database() {
  451. $module = $M = array();
  452. $M = getcache('modules', 'commons');
  453. if (is_array($M)) {
  454. foreach ($M as $key => $m) {
  455. if (file_exists(PC_PATH.'modules'.DIRECTORY_SEPARATOR.$key.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$key.'_tag.class.php') && !in_array($key, array('message', 'block'))) {
  456. $module[$key] = $m['name'];
  457. }
  458. }
  459. }
  460. $filepath = CACHE_PATH.'configs/';
  461. $module = "<?php\nreturn ".var_export($module, true).";\n?>";
  462. return $file_size = pc_base::load_config('system','lock_ex') ? file_put_contents($filepath.'modules.php', $module, LOCK_EX) : file_put_contents($filepath.'modules.php', $module);
  463. }
  464. /**
  465. * 根据数据库记录更新缓存
  466. */
  467. public function cache2database() {
  468. $cache = pc_base::load_model('cache_model');
  469. if (!isset($_GET['pages']) && empty($_GET['pages'])) {
  470. $r = $cache->get_one(array(), 'COUNT(*) AS num');
  471. if ($r['num']) {
  472. $total = $r['num'];
  473. $pages = ceil($total/20);
  474. } else {
  475. $pages = 1;
  476. }
  477. } else {
  478. $pages = intval($_GET['pages']);
  479. }
  480. $currpage = max(intval($_GET['currpage']), 1);
  481. $offset = ($currpage-1)*20;
  482. $result = $cache->select(array(), '*', $offset.', 20', 'filename ASC');
  483. if (is_array($result) && !empty($result)) {
  484. foreach ($result as $re) {
  485. if (!file_exists(CACHE_PATH.$re['path'].$re['filename'])) {
  486. $filesize = pc_base::load_config('system','lock_ex') ? file_put_contents(CACHE_PATH.$re['path'].$re['filename'], $re['data'], LOCK_EX) : file_put_contents(CACHE_PATH.$re['path'].$re['filename'], $re['data']);
  487. } else {
  488. continue;
  489. }
  490. }
  491. }
  492. $currpage++;
  493. if ($currpage>$pages) {
  494. return true;
  495. } else {
  496. echo '<script type="text/javascript">window.parent.addtext("<li>'.L('part_cache_success').($currpage-1).'/'.$pages.'..........</li>");</script>';
  497. showmessage(L('part_cache_success'), '?m=admin&c=cache_all&a=init&page='.$_GET['page'].'&currpage='.$currpage.'&pages='.$pages.'&dosubmit=1',0);
  498. }
  499. }
  500. /**
  501. * 更新删除缓存文件方法
  502. */
  503. public function del_file() {
  504. $path = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR;
  505. $files = glob($path.'*');
  506. pc_base::load_sys_func('dir');
  507. if (is_array($files)) {
  508. foreach ($files as $f) {
  509. $dir = basename($f);
  510. if (!in_array($dir, array('block', 'dbsource'))) {
  511. dir_delete($path.$dir);
  512. }
  513. }
  514. }
  515. $path = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_tpl_data'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR;
  516. $files = glob($path.'*');
  517. if (is_array($files)) {
  518. foreach ($files as $f) {
  519. $dir = basename($f);
  520. @unlink($path.$dir);
  521. }
  522. }
  523. return true;
  524. }
  525. /**
  526. * 更新来源缓存方法
  527. */
  528. public function copyfrom() {
  529. $infos = $this->db->select('','*','','listorder DESC','','id');
  530. setcache('copyfrom', $infos, 'admin');
  531. return true;
  532. }
  533. /**
  534. * 同步视频模型栏目
  535. */
  536. public function video_category_tb() {
  537. if (module_exists('video')) {
  538. $setting = getcache('video', 'video');
  539. pc_base::load_app_class('ku6api', 'video', 0);
  540. $ku6api = new ku6api($setting['sn'], $setting['skey']);
  541. $ku6api->get_categorys();
  542. }
  543. return true;
  544. }
  545. }