cache.func.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. <?php
  2. /**
  3. * [WeEngine System] Copyright (c) 2014 WE7.CC
  4. * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
  5. */
  6. defined('IN_IA') or exit('Access Denied');
  7. load()->func('cache.' . cache_type());
  8. function cache_type() {
  9. global $_W;
  10. $cacher = $connect = '';
  11. $cache_type = strtolower($_W['config']['setting']['cache']);
  12. if (extension_loaded($cache_type)) {
  13. $config = $_W['config']['setting'][$cache_type];
  14. if (!empty($config['server']) && !empty($config['port'])) {
  15. if ('memcached' == $cache_type) {
  16. $cacher = new Memcached();
  17. $connect = $cacher->addServer(
  18. $config['server'],
  19. !empty($config['port']) ? $config['port'] : 11211,
  20. !empty($config['weight']) ? $config['weight'] : 1
  21. );
  22. if (isset($config['username']) && isset($config['password'])) {
  23. $cacher->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
  24. $cacher->setSaslAuthData($config['username'], $config['password']);
  25. }
  26. } elseif ('memcache' == $cache_type) {
  27. $cacher = new Memcache();
  28. $connect = $cacher->connect($config['server'], $config['port']);
  29. } elseif ('redis' == $cache_type) {
  30. $cacher = new Redis();
  31. $connect = $cacher->connect($config['server'], $config['port']);
  32. }
  33. }
  34. }
  35. if (empty($cacher) || empty($connect)) {
  36. $cache_type = 'mysql';
  37. }
  38. return $cache_type;
  39. }
  40. function cache_load($key, $unserialize = false) {
  41. global $_W;
  42. static $we7_cache;
  43. if (is_error($key)) {
  44. trigger_error($key['message'], E_USER_WARNING);
  45. return false;
  46. }
  47. if (!empty($we7_cache[$key])) {
  48. return $we7_cache[$key];
  49. }
  50. $data = $we7_cache[$key] = cache_read($key);
  51. if ('setting' == $key) {
  52. $_W['setting'] = $data;
  53. return $_W['setting'];
  54. } elseif ('modules' == $key) {
  55. $_W['modules'] = $data;
  56. return $_W['modules'];
  57. } elseif ('module_receive_enable' == $key && empty($data)) {
  58. cache_build_module_subscribe_type();
  59. return cache_read($key);
  60. } else {
  61. return $unserialize ? iunserializer($data) : $data;
  62. }
  63. }
  64. function &cache_global($key) {
  65. }
  66. function cache_system_key($cache_key) {
  67. $cache_key_all = cache_key_all();
  68. $params = array();
  69. $args = func_get_args();
  70. if (empty($args[1])) {
  71. $args[1] = '';
  72. }
  73. if (!is_array($args[1])) {
  74. $cache_key = empty($cache_key_all['caches'][$cache_key]['key']) ? '' : $cache_key_all['caches'][$cache_key]['key'];
  75. preg_match_all('/\%([a-zA-Z\_\-0-9]+)/', $cache_key, $matches);
  76. for ($i = 0; $i < func_num_args() - 1; ++$i) {
  77. $matches[0][$i] = empty($matches[0][$i]) ? '' : $matches[0][$i];
  78. $cache_key = str_replace($matches[0][$i], $args[$i + 1], $cache_key);
  79. }
  80. return 'we7:' . $cache_key;
  81. } else {
  82. $params = $args[1];
  83. }
  84. if (empty($params)) {
  85. $res = preg_match_all('/([a-zA-Z\_\-0-9]+):/', $cache_key, $matches);
  86. if ($res) {
  87. $key = count($matches[1]) > 0 ? $matches[1][0] : $matches[1];
  88. } else {
  89. $key = $cache_key;
  90. }
  91. if (empty($cache_key_all['caches'][$key])) {
  92. return error(1, '缓存' . $key . ' 不存在!');
  93. } else {
  94. $cache_info_key = $cache_key_all['caches'][$key]['key'];
  95. preg_match_all('/\%([a-zA-Z\_\-0-9]+)/', $cache_info_key, $key_params);
  96. preg_match_all('/\:([a-zA-Z\_\-0-9]+)/', $cache_key, $val_params);
  97. if (count($key_params[1]) != count($val_params[1])) {
  98. foreach ($key_params[1] as $key => $val) {
  99. if (in_array($val, array_keys($cache_key_all['common_params']))) {
  100. $cache_info_key = str_replace('%' . $val, $cache_key_all['common_params'][$val], $cache_info_key);
  101. unset($key_params[1][$key]);
  102. }
  103. }
  104. if (count($key_params[1]) == count($val_params[1])) {
  105. $arr = array_combine($key_params[1], $val_params[1]);
  106. foreach ($arr as $key => $val) {
  107. if (preg_match('/\%' . $key . '/', $cache_info_key)) {
  108. $cache_info_key = str_replace('%' . $key, $val, $cache_info_key);
  109. }
  110. }
  111. }
  112. if (strexists($cache_info_key, '%')) {
  113. return error(1, '缺少缓存参数或参数不正确!');
  114. } else {
  115. return 'we7:' . $cache_info_key;
  116. }
  117. } else {
  118. return 'we7:' . $cache_key;
  119. }
  120. }
  121. }
  122. $cache_info = $cache_key_all['caches'][$cache_key];
  123. $cache_common_params = $cache_key_all['common_params'];
  124. if (empty($cache_info)) {
  125. return error(2, '缓存 ' . $cache_key . ' 不存在!');
  126. } else {
  127. $cache_key = $cache_info['key'];
  128. }
  129. foreach ($cache_common_params as $param_name => $param_val) {
  130. preg_match_all('/\%([a-zA-Z\_\-0-9]+)/', $cache_key, $matches);
  131. if (in_array($param_name, $matches[1]) && !in_array($param_name, array_keys($params))) {
  132. $params[$param_name] = $cache_common_params[$param_name];
  133. }
  134. }
  135. if (is_array($params) && !empty($params)) {
  136. foreach ($params as $key => $param) {
  137. $cache_key = str_replace('%' . $key, $param, $cache_key);
  138. }
  139. if (strexists($cache_key, '%')) {
  140. return error(1, '缺少缓存参数或参数不正确!');
  141. }
  142. }
  143. $cache_key = 'we7:' . $cache_key;
  144. if (strlen($cache_key) > CACHE_KEY_LENGTH) {
  145. trigger_error('Cache name is over the maximum length');
  146. }
  147. return $cache_key;
  148. }
  149. function cache_relation_keys($key) {
  150. if (!is_string($key)) {
  151. return $key;
  152. }
  153. if (!strexists($key, 'we7:')) {
  154. return array($key);
  155. }
  156. $cache_param_values = explode(':', $key);
  157. $cache_name = $cache_param_values[1];
  158. unset($cache_param_values[0]);
  159. unset($cache_param_values[1]);
  160. if (empty($cache_param_values)) {
  161. preg_match_all('/\:([a-zA-Z\_\-0-9]+)/', $key, $matches);
  162. $cache_name = empty($matches[1][0]) ? '' : $matches[1][0];
  163. }
  164. $cache_key_all = cache_key_all();
  165. $cache_relations = $cache_key_all['groups'];
  166. $cache_common_params = $cache_key_all['common_params'];
  167. $cache_info = empty($cache_name) ? array() : $cache_key_all['caches'][$cache_name];
  168. if (empty($cache_info)) {
  169. return error(2, '缓存 : ' . $key . '不存在');
  170. }
  171. if (!empty($cache_info['group'])) {
  172. if (empty($cache_relations[$cache_info['group']])) {
  173. return error(1, '关联关系未定义');
  174. }
  175. $relation_keys = $cache_relations[$cache_info['group']]['relations'];
  176. $cache_keys = array();
  177. foreach ($relation_keys as $key => $val) {
  178. if ($val == $cache_name) {
  179. $relation_cache_key = $cache_key_all['caches'][$val]['key'];
  180. } else {
  181. $relation_cache_key = $cache_key_all['caches'][$cache_name]['key'];
  182. }
  183. foreach ($cache_common_params as $param_name => $param_val) {
  184. preg_match_all('/\%([a-zA-Z\_\-0-9]+)/', $relation_cache_key, $matches);
  185. if (in_array($param_name, $matches[1])) {
  186. $cache_key_params[$param_name] = $cache_common_params[$param_name];
  187. }
  188. if (!empty($cache_prams_values) || count($matches[1]) == count($cache_param_values)) {
  189. $cache_key_params = array_combine($matches[1], $cache_param_values);
  190. } else {
  191. $cache_key_params = array();
  192. }
  193. }
  194. $cache_key = cache_system_key($val, $cache_key_params);
  195. if (!is_error($cache_key)) {
  196. $cache_keys[] = $cache_key;
  197. } else {
  198. return error(1, $cache_key['message']);
  199. }
  200. }
  201. } else {
  202. $cache_keys[] = $key;
  203. }
  204. return $cache_keys;
  205. }
  206. function cache_key_all() {
  207. global $_W;
  208. $caches_all = array(
  209. 'common_params' => array(
  210. 'uniacid' => $_W['uniacid'],
  211. 'uid' => $_W['uid'],
  212. ),
  213. 'caches' => array(
  214. 'module_info' => array(
  215. 'key' => 'module_info:%module_name',
  216. 'group' => 'module',
  217. ),
  218. 'module_main_info' => array(
  219. 'key' => 'module_main_info:%module_name',
  220. 'group' => 'module',
  221. ),
  222. 'module_setting' => array(
  223. 'key' => 'module_setting:%module_name:%uniacid',
  224. 'group' => 'module',
  225. ),
  226. 'last_account' => array(
  227. 'key' => 'last_account:%switch:%uid',
  228. 'group' => '',
  229. ),
  230. 'last_account_type' => array(
  231. 'key' => 'last_account_type',
  232. 'group' => '',
  233. ),
  234. 'user_modules' => array(
  235. 'key' => 'user_modules:%uid',
  236. 'group' => '',
  237. ),
  238. 'user_accounts' => array(
  239. 'key' => 'user_accounts:%type:%uid',
  240. 'group' => '',
  241. ),
  242. 'unimodules' => array(
  243. 'key' => 'unimodules:%uniacid',
  244. 'group' => '',
  245. ),
  246. 'unimodules_binding' => array(
  247. 'key' => 'unimodules_binding:%uniacid',
  248. 'group' => '',
  249. ),
  250. 'expired_modules' => array(
  251. 'key' => 'expired_modules',
  252. 'group' => '',
  253. ),
  254. 'cloud_expired_modules' => array(
  255. 'key' => 'cloud_expired_modules',
  256. 'group' => '',
  257. ),
  258. 'local_dev_modules' => array(
  259. 'key' => 'local_dev_modules',
  260. 'group' => '',
  261. ),
  262. 'uni_groups' => array(
  263. 'key' => 'uni_groups:%groupids',
  264. 'group' => '',
  265. ),
  266. 'permission' => array(
  267. 'key' => 'permission:%uniacid:%uid',
  268. 'group' => '',
  269. ),
  270. 'memberinfo' => array(
  271. 'key' => 'memberinfo:%uid',
  272. 'group' => '',
  273. ),
  274. 'statistics' => array(
  275. 'key' => 'statistics:%uniacid',
  276. 'group' => '',
  277. ),
  278. 'uniacid_visit' => array(
  279. 'key' => 'uniacid_visit:%uniacid:%today',
  280. 'group' => '',
  281. ),
  282. 'material_reply' => array(
  283. 'key' => 'material_reply:%attach_id',
  284. 'group' => '',
  285. ),
  286. 'keyword' => array(
  287. 'key' => 'keyword:%content:%uniacid',
  288. 'group' => '',
  289. ),
  290. 'back_days' => array(
  291. 'key' => 'back_days',
  292. 'group' => '',
  293. ),
  294. 'miniapp_version' => array(
  295. 'key' => 'miniapp_version:%version_id',
  296. 'group' => '',
  297. ),
  298. 'proxy_wechatpay_account' => array(
  299. 'key' => 'proxy_wechatpay_account',
  300. 'group' => '',
  301. ),
  302. 'recycle_module' => array(
  303. 'key' => 'recycle_module',
  304. 'group' => '',
  305. ),
  306. 'random' => array(
  307. 'key' => 'random',
  308. 'group' => '',
  309. ),
  310. 'sync_fans_pindex' => array(
  311. 'key' => 'sync_fans_pindex:%uniacid',
  312. 'group' => '',
  313. ),
  314. 'uniaccount' => array(
  315. 'key' => 'uniaccount:%uniacid',
  316. 'group' => 'uniaccount',
  317. ),
  318. 'unisetting' => array(
  319. 'key' => 'unisetting:%uniacid',
  320. 'group' => 'uniaccount',
  321. ),
  322. 'defaultgroupid' => array(
  323. 'key' => 'defaultgroupid:%uniacid',
  324. 'group' => 'uniaccount',
  325. ),
  326. 'uniaccount_type' => array(
  327. 'key' => 'uniaccount_type:%account_type',
  328. 'group' => '',
  329. ),
  330. 'accesstoken' => array(
  331. 'key' => 'accesstoken:%uniacid',
  332. 'group' => 'accesstoken',
  333. ),
  334. 'jsticket' => array(
  335. 'key' => 'jsticket:%uniacid',
  336. 'group' => 'accesstoken',
  337. ),
  338. 'cardticket' => array(
  339. 'key' => 'cardticket:%uniacid',
  340. 'group' => 'accesstoken',
  341. ),
  342. 'accesstoken_key' => array(
  343. 'key' => 'accesstoken_key:%key',
  344. 'group' => '',
  345. ),
  346. 'account_oauth_refreshtoken' => array(
  347. 'key' => 'account_oauth_refreshtoken:%acid',
  348. 'group' => '',
  349. ),
  350. 'account_auth_refreshtoken' => array(
  351. 'key' => 'account_auth_refreshtoken:%uniacid',
  352. 'group' => '',
  353. ),
  354. 'account_tags' => array(
  355. 'key' => 'account_tags:%uniacid',
  356. 'group' => '',
  357. ),
  358. 'unicount' => array(
  359. 'key' => 'unicount:%uniacid',
  360. 'group' => '',
  361. ),
  362. 'checkupgrade' => array(
  363. 'key' => 'checkupgrade',
  364. 'group' => '',
  365. ),
  366. 'cloud_transtoken' => array(
  367. 'key' => 'cloud_transtoken',
  368. 'group' => '',
  369. ),
  370. 'cloud_w7_request_token' => array(
  371. 'key' => 'cloud_w7_request_token',
  372. 'group' => '',
  373. ),
  374. 'cloud_w7_request_user_token' => array(
  375. 'key' => 'cloud_w7_request_user_token:%token',
  376. 'group' => '',
  377. ),
  378. 'cloud_bind_console_token' => array(
  379. 'key' => 'cloud_bind_console_token:%code',
  380. 'group' => '',
  381. ),
  382. 'upgrade' => array(
  383. 'key' => 'upgrade',
  384. 'group' => '',
  385. ),
  386. 'account_ticket' => array(
  387. 'key' => 'account_ticket',
  388. 'group' => '',
  389. ),
  390. 'oauthaccesstoken' => array(
  391. 'key' => 'oauthaccesstoken:%acid',
  392. 'group' => '',
  393. ),
  394. 'account_component_assesstoken' => array(
  395. 'key' => 'account_component_assesstoken',
  396. 'group' => '',
  397. ),
  398. 'cloud_api' => array(
  399. 'key' => 'cloud_api:%method',
  400. 'group' => '',
  401. ),
  402. 'cloud_file_permission_pass' => array(
  403. 'key' => 'cloud_file_permission_pass',
  404. 'group' => '',
  405. ),
  406. 'couponsync' => array(
  407. 'key' => 'couponsync:%uniacid',
  408. 'group' => '',
  409. ),
  410. 'storesync' => array(
  411. 'key' => 'storesync:%uniacid',
  412. 'group' => '',
  413. ),
  414. 'cloud_auth_transfer' => array(
  415. 'key' => 'cloud_auth_transfer',
  416. 'group' => '',
  417. ),
  418. 'modulesetting' => array(
  419. 'key' => 'modulesetting:%module:%acid',
  420. 'group' => '',
  421. ),
  422. 'scan_config' => array(
  423. 'key' => 'scan_config',
  424. 'group' => 'scan_file',
  425. ),
  426. 'scan_file' => array(
  427. 'key' => 'scan_file',
  428. 'group' => 'scan_file',
  429. ),
  430. 'scan_badfile' => array(
  431. 'key' => 'scan_badfile',
  432. 'group' => 'scan_file',
  433. ),
  434. 'bomtree' => array(
  435. 'key' => 'bomtree',
  436. 'group' => '',
  437. ),
  438. 'setting' => array(
  439. 'key' => 'setting',
  440. 'group' => '',
  441. ),
  442. 'stat_todaylock' => array(
  443. 'key' => 'stat_todaylock:%uniacid',
  444. 'group' => '',
  445. ),
  446. 'account_preauthcode' => array(
  447. 'key' => 'account_preauthcode',
  448. 'group' => '',
  449. ),
  450. 'account_auth_accesstoken' => array(
  451. 'key' => 'account_auth_accesstoken:%key',
  452. 'group' => '',
  453. ),
  454. 'usersfields' => array(
  455. 'key' => 'usersfields',
  456. 'group' => '',
  457. ),
  458. 'userbasefields' => array(
  459. 'key' => 'userbasefields',
  460. 'group' => '',
  461. ),
  462. 'system_frame' => array(
  463. 'key' => 'system_frame:%uniacid',
  464. 'group' => '',
  465. ),
  466. 'module_receive_enable' => array(
  467. 'key' => 'module_receive_enable',
  468. 'group' => '',
  469. ),
  470. 'module_entry_call' => array(
  471. 'key' => 'module_entry_call:%module_name:%uniacid',
  472. 'group' => '',
  473. ),
  474. 'system_check' => array(
  475. 'key' => 'system_check',
  476. 'group' => '',
  477. ),
  478. 'delete_visit_ip' => array(
  479. 'key' => 'delete_visit_ip:%date',
  480. 'group' => '',
  481. ),
  482. 'account_web_view_domain' => array(
  483. 'key' => 'account_web_view_domain:%uniacid',
  484. 'group' => '',
  485. ),
  486. 'system_db_diff' => array(
  487. 'key' => 'system_db_diff',
  488. 'group' => '',
  489. ),
  490. 'zhida_content' => array(
  491. 'key' => 'zhida_content',
  492. 'group' => '',
  493. ),
  494. 'cloud_rgapi_sign' => array(
  495. 'key' => 'cloud_rgapi_sign',
  496. 'group' => '',
  497. ),
  498. ),
  499. 'groups' => array(
  500. 'uniaccount' => array(
  501. 'relations' => array('uniaccount', 'unisetting', 'defaultgroupid'),
  502. ),
  503. 'accesstoken' => array(
  504. 'relations' => array('accesstoken', 'jsticket', 'cardticket'),
  505. ),
  506. 'scan_file' => array(
  507. 'relations' => array('scan_file', 'scan_config', 'scan_badfile'),
  508. ),
  509. 'module' => array(
  510. 'relations' => array('module_info', 'module_setting', 'module_main_info'),
  511. ),
  512. ),
  513. );
  514. return $caches_all;
  515. }