📄 cache.func.php
字号:
<?php
/*
[Discuz!] (C)2001-2007 Comsenz Inc.
This is NOT a freeware, use is subject to license terms
$Id: cache.func.php 13810 2008-06-06 01:42:12Z cnteacher $
*/
define('DISCUZ_KERNEL_VERSION', '6.1.0');
define('DISCUZ_KERNEL_RELEASE', '20080606');
if(isset($_GET['kernel_version'])) {
exit('Crossday Discuz! Board<br />Developed by Comsenz Inc.<br /><br />Version: '.DISCUZ_KERNEL_VERSION.'<br />Release: '.DISCUZ_KERNEL_RELEASE);
} elseif(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
function updatecache($cachename = '') {
global $db, $bbname, $tablepre, $maxbdays;
static $cachescript = array
(
'settings' => array('settings'),
'forums' => array('forums'),
'icons' => array('icons'),
'ranks' => array('ranks'),
'usergroups' => array('usergroups'),
'request' => array('request'),
'medals' => array('medals'),
'magics' => array('magics'),
'topicadmin' => array('modreasons'),
'archiver' => array('advs_archiver'),
'register' => array('advs_register'),
'faqs' => array('faqs'),
'secqaa' => array('secqaa'),
'censor' => array('censor'),
'ipbanned' => array('ipbanned'),
'google' => array('google'),
'index' => array('announcements', 'onlinelist', 'forumlinks', 'advs_index', 'tags_index'),
'forumdisplay' => array('smilies', 'smileytypes', 'smilies_display', 'announcements_forum', 'globalstick', 'floatthreads', 'forums', 'icons', 'onlinelist', 'advs_forumdisplay'),
'viewthread' => array('smilies', 'smileytypes', 'smilies_display', 'forums', 'usergroups', 'ranks', 'bbcodes', 'smilies', 'advs_viewthread', 'tags_viewthread', 'custominfo'),
'post' => array('bbcodes_display', 'bbcodes', 'smilies_display', 'smilies', 'smileytypes', 'icons'),
'profilefields' => array('fields_required', 'fields_optional'),
'viewpro' => array('fields_required', 'fields_optional', 'custominfo'),
'bbcodes' => array('bbcodes', 'smilies', 'smileytypes'),
);
if($maxbdays) {
$cachescript['birthdays'] = array('birthdays');
$cachescript['index'][] = 'birthdays_index';
}
$updatelist = empty($cachename) ? array_values($cachescript) : (is_array($cachename) ? array('0' => $cachename) : array(array('0' => $cachename)));
$updated = array();
foreach($updatelist as $value) {
foreach($value as $cname) {
if(empty($updated) || !in_array($cname, $updated)) {
$updated[] = $cname;
getcachearray($cname);
}
}
}
foreach($cachescript as $script => $cachenames) {
if(empty($cachename) || (!is_array($cachename) && in_array($cachename, $cachenames)) || (is_array($cachename) && array_intersect($cachename, $cachenames))) {
$cachedata = '';
$query = $db->query("SELECT data FROM {$tablepre}caches WHERE cachename in(".implodeids($cachenames).")");
while($data = $db->fetch_array($query)) {
$cachedata .= $data['data'];
}
writetocache($script, $cachenames, $cachedata);
}
}
if(!$cachename || $cachename == 'styles') {
$stylevars = array();
$defaultstyleid = $db->result_first("SELECT value FROM {$tablepre}settings WHERE variable = 'styleid'");
$query = $db->query("SELECT sv.* FROM {$tablepre}stylevars sv LEFT JOIN {$tablepre}styles s ON s.styleid = sv.styleid AND (s.available=1 OR s.styleid='$defaultstyleid')");
while($var = $db->fetch_array($query)) {
$stylevars[$var['styleid']][$var['variable']] = $var['substitute'];
}
$query = $db->query("SELECT s.*, t.directory AS tpldir FROM {$tablepre}styles s LEFT JOIN {$tablepre}templates t ON s.templateid=t.templateid WHERE s.available=1 OR s.styleid='$defaultstyleid'");
while($data = $db->fetch_array($query)) {
$data = array_merge($data, $stylevars[$data['styleid']]);
$data['bgcode'] = setcssbackground($data, 'bgcolor');
$data['catbgcode'] = setcssbackground($data, 'catcolor');
$data['headerbgcode'] = setcssbackground($data, 'headercolor');
$data['headermenubgcode'] = setcssbackground($data, 'headermenu');
$data['portalboxbgcode'] = setcssbackground($data, 'portalboxbgcode');
if(strstr($data['boardimg'], ',')) {
$flash = explode(",", $data['boardimg']);
$flash[0] = trim($flash[0]);
$flash[0] = preg_match('/^http:\/\//i', $flash[0]) ? $flash[0] : $data['imgdir'].'/'.$flash[0];
$data['boardlogo'] = "<embed src=\"".$flash[0]."\" width=\"".trim($flash[1])."\" height=\"".trim($flash[2])."\" type=\"application/x-shockwave-flash\"></embed>";
} else {
$data['boardimg'] = preg_match('/^http:\/\//i', $data['boardimg']) ? $data['boardimg'] : $data['imgdir'].'/'.$data['boardimg'];
$data['boardlogo'] = "<img src=\"$data[boardimg]\" alt=\"$bbname\" border=\"0\" />";
}
$data['bold'] = $data['nobold'] ? 'normal' : 'bold';
writetocache($data['styleid'], '', getcachevars($data, 'CONST'), 'style_');
writetocsscache($data);
}
}
if(!$cachename || $cachename == 'usergroups') {
$query = $db->query("SELECT * FROM {$tablepre}usergroups u
LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid");
while($data = $db->fetch_array($query)) {
$ratearray = array();
if($data['raterange']) {
foreach(explode("\n", $data['raterange']) as $rating) {
$rating = explode("\t", $rating);
$ratearray[$rating[0]] = array('min' => $rating[1], 'max' => $rating[2], 'mrpd' => $rating[3]);
}
}
$data['raterange'] = $ratearray;
$data['grouptitle'] = $data['color'] ? '<font color="'.$data['color'].'">'.$data['grouptitle'].'</font>' : $data['grouptitle'];
$data['grouptype'] = $data['type'];
$data['grouppublic'] = $data['system'] != 'private';
$data['groupcreditshigher'] = $data['creditshigher'];
$data['groupcreditslower'] = $data['creditslower'];
unset($data['type'], $data['system'], $data['creditshigher'], $data['creditslower'], $data['color'], $data['groupavatar'], $data['admingid']);
foreach($data as $key => $val) {
if(!isset($data[$key])) {
unset($data[$key]);
}
}
writetocache($data['groupid'], '', getcachevars($data), 'usergroup_');
}
}
if(!$cachename || $cachename == 'admingroups') {
$query = $db->query("SELECT * FROM {$tablepre}admingroups");
while($data = $db->fetch_array($query)) {
writetocache($data['admingid'], '', getcachevars($data), 'admingroup_');
}
}
if(!$cachename || $cachename == 'plugins') {
$query = $db->query("SELECT pluginid, available, adminid, name, identifier, datatables, directory, copyright, modules FROM {$tablepre}plugins");
while($plugin = $db->fetch_array($query)) {
$data = array_merge($plugin, array('modules' => array()), array('vars' => array()));
$plugin['modules'] = unserialize($plugin['modules']);
if(is_array($plugin['modules'])) {
foreach($plugin['modules'] as $module) {
$data['modules'][$module['name']] = $module;
}
}
$queryvars = $db->query("SELECT variable, value FROM {$tablepre}pluginvars WHERE pluginid='$plugin[pluginid]'");
while($var = $db->fetch_array($queryvars)) {
$data['vars'][$var['variable']] = $var['value'];
}
writetocache($plugin['identifier'], '', "\$_DPLUGIN['$plugin[identifier]'] = ".arrayeval($data), 'plugin_');
}
}
if(!$cachename || $cachename == 'threadtypes') {
$typelist = $templatedata = array();
$query = $db->query("SELECT t.typeid, tt.optionid, tt.title, tt.type, tt.rules, tt.identifier, tt.description, tv.required, tv.unchangeable, tv.search
FROM {$tablepre}threadtypes t
LEFT JOIN {$tablepre}typevars tv ON t.typeid=tv.typeid
LEFT JOIN {$tablepre}typeoptions tt ON tv.optionid=tt.optionid
WHERE t.special='1' AND tv.available='1'
ORDER BY tv.displayorder");
while($data = $db->fetch_array($query)) {
$data['rules'] = unserialize($data['rules']);
$typeid = $data['typeid'];
$optionid = $data['optionid'];
$typelist[$typeid][$optionid] = array(
'title' => dhtmlspecialchars($data['title']),
'type' => dhtmlspecialchars($data['type']),
'identifier' => dhtmlspecialchars($data['identifier']),
'description' => dhtmlspecialchars($data['description']),
'required' => intval($data['required']),
'unchangeable' => intval($data['unchangeable']),
'search' => intval($data['search'])
);
if(in_array($data['type'], array('select', 'checkbox', 'radio'))) {
if($data['rules']['choices']) {
$choices = array();
foreach(explode("\n", $data['rules']['choices']) as $item) {
list($index, $choice) = explode('=', $item);
$choices[trim($index)] = trim($choice);
}
$typelist[$typeid][$optionid]['choices'] = $choices;
} else {
$typelist[$typeid][$optionid]['choices'] = array();
}
} elseif(in_array($data['type'], array('text', 'textarea'))) {
$typelist[$typeid][$optionid]['maxlength'] = intval($data['rules']['maxlength']);
} elseif($data['type'] == 'image') {
$typelist[$typeid][$optionid]['maxwidth'] = intval($data['rules']['maxwidth']);
$typelist[$typeid][$optionid]['maxheight'] = intval($data['rules']['maxheight']);
} elseif($data['type'] == 'number') {
$typelist[$typeid][$optionid]['maxnum'] = intval($data['rules']['maxnum']);
$typelist[$typeid][$optionid]['minnum'] = intval($data['rules']['minnum']);
}
}
$query = $db->query("SELECT typeid, description, template FROM {$tablepre}threadtypes WHERE special='1'");
while($data = $db->fetch_array($query)) {
$templatedata[$data['typeid']] = $data['template'];
$threaddesc[$data['typeid']] = dhtmlspecialchars($data['description']);
}
foreach($typelist as $typeid => $option) {
writetocache($typeid, '', "\$_DTYPE = ".arrayeval($option).";\n\n\$_DTYPETEMPLATE = \"".addslashes($templatedata[$typeid])."\";\n", 'threadtype_');
}
}
}
function setcssbackground(&$data, $code) {
$codes = explode(' ', $data[$code]);
$css = $codevalue = '';
for($i = 0; $i <= 1; $i++) {
if($codes[$i] != '') {
if($codes[$i]{0} == '#') {
$css .= strtoupper($codes[$i]).' ';
$codevalue = strtoupper($codes[$i]);
} elseif(preg_match('/^http:\/\//i', $codes[$i])) {
$css .= 'url(\"'.$codes[$i].'\") ';
} else {
$css .= 'url("'.$data['imgdir'].'/'.$codes[$i].'") ';
}
}
}
$data[$code] = $codevalue;
return 'background: '.trim($css);
}
function updatesettings() {
global $_DCACHE;
if(isset($_DCACHE['settings']) && is_array($_DCACHE['settings'])) {
writetocache('settings', '', '$_DCACHE[\'settings\'] = '.arrayeval($_DCACHE['settings']).";\n\n");
}
}
function writetocache($script, $cachenames, $cachedata = '', $prefix = 'cache_') {
global $authkey;
if(is_array($cachenames) && !$cachedata) {
foreach($cachenames as $name) {
$cachedata .= getcachearray($name, $script);
}
}
$dir = DISCUZ_ROOT.'./forumdata/cache/';
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if($fp = @fopen("$dir$prefix$script.php", 'wb')) {
fwrite($fp, "<?php\n//Discuz! cache file, DO NOT modify me!".
"\n//Created: ".date("M j, Y, G:i").
"\n//Identify: ".md5($prefix.$script.'.php'.$cachedata.$authkey)."\n\n$cachedata?>");
fclose($fp);
} else {
exit('Can not write to cache files, please check directory ./forumdata/ and ./forumdata/cache/ .');
}
}
function writetocsscache($data) {
$cssdata = '';
foreach(array('_common' => array('css_common', 'css_append'),
'_editor' => array('css_editor'),
'_special' => array('css_special'),
'_viewthread' => array('css_viewthread'),
'_calendar' => array('css_calendar')
) as $extra => $cssfiles) {
$cssdata = '';
foreach($cssfiles as $css) {
$cssfile = DISCUZ_ROOT.'./'.$data['tpldir'].'/'.$css.'.htm';
!file_exists($cssfile) && $cssfile = DISCUZ_ROOT.'./templates/default/'.$css.'.htm';
$fp = fopen($cssfile, 'r');
$cssdata .= fread($fp, filesize($cssfile))."\n\n";
fclose($fp);
}
$cssdata = preg_replace("/\{([A-Z0-9]+)\}/e", '\$data[strtolower(\'\1\')]', $cssdata);
$cssdata = preg_replace("/<\?.+?\?>\s*/", '', $cssdata);
$cssdata = !preg_match('/^http:\/\//i', $data['imgdir']) ? str_replace("url(\"$data[imgdir]", "url(\"../../$data[imgdir]", $cssdata) : $cssdata;
$cssdata = !preg_match('/^http:\/\//i', $data['imgdir']) ? str_replace("url($data[imgdir]", "url(../../$data[imgdir]", $cssdata) : $cssdata;
if(@$fp = fopen(DISCUZ_ROOT.'./forumdata/cache/style_'.$data['styleid'].$extra.'.css', 'w')) {
fwrite($fp, $cssdata);
fclose($fp);
} else {
exit('Can not write to cache files, please check directory ./forumdata/ and ./forumdata/cache/ .');
}
}
}
function getcachearray($cachename, $script = '') {
global $db, $timestamp, $tablepre, $timeoffset, $maxbdays, $smcols, $smrows, $charset;
$cols = '*';
$conditions = '';
switch($cachename) {
case 'settings':
$table = 'settings';
$conditions = "WHERE variable NOT IN ('siteuniqueid', 'mastermobile', 'bbrules', 'bbrulestxt', 'closedreason', 'creditsnotify', 'backupdir', 'custombackup', 'jswizard', 'maxonlines', 'modreasons', 'newsletter', 'welcomemsg', 'welcomemsgtxt', 'postno', 'postnocustom', 'customauthorinfo')";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -