'.dr_lang('安装「系统安全加固」插件可以大大提高安全等级');
}
if ($rt) {
$this->halt(implode('
', $rt), 0);
}
$this->_json(1,dr_lang('完成'));
break;
case '10':
// 数据负载
$rt = [];
// 任务队列
$cron = \Phpcmf\Service::M()->table('cron')->counts();
if ($cron > 10) {
$rt[] = ''.dr_lang('【任务队列】含有大量未执行的任务,会影响加载速度,建议删除不需要的任务').'';
}
// 模块数据检测
if (IS_USE_MODULE) {
$module = \Phpcmf\Service::M()->table('module')->getAll();
if ($module) {
foreach ($module as $m) {
$site = dr_string2array($m['site']);
$mform = \Phpcmf\Service::M()->is_table_exists('module_form') ? \Phpcmf\Service::M()->table('module_form')->where('module', $m['dirname'])->getAll() : [];
foreach ($this->site_info as $siteid => $s) {
if (isset($site[$siteid]) && $site[$siteid]) {
$r = $this->_check_table_counts($siteid . '_' . $m['dirname'], $m['dirname'] . dr_lang('模块主表'));
$r && $rt[] = $r;
if ($mform) {
foreach ($mform as $mm) {
$r = $this->_check_table_counts(
$siteid . '_' . $m['dirname'] . '_form_' . $mm['table'],
$m['dirname'] . dr_lang('模块') . $mm['name'] . dr_lang('表')
);
$r && $rt[] = $r;
}
}
}
}
}
}
}
if ($rt) {
$this->halt(implode('
', $rt), 0);
}
$this->_json(1,dr_lang('正常'));
break;
case '11':
// 域名检测
if (!function_exists('stream_context_create')) {
$this->halt(dr_lang('函数没有被启用:%s', 'stream_context_create'), 0);
}
$error = $tips = [];
list($a, $data) = \Phpcmf\Service::M('Site')->domain();
if ($data) {
foreach ($data as $name => $domain) {
$url = '';
$cname = '';
if ($name == 'mobile_domain') {
if ($domain) {
$url = dr_http_prefix($domain) . '/api.php';
} else {
$tips[] = dr_lang('当前站点没有绑定手机域名,可能无法使用移动端界面');
}
$cname = '移动端';
} elseif (strpos($name, 'module_') === 0) {
// 模块
if ($domain) {
$url = dr_http_prefix($domain) . '/api.php';
}
$cname = '模块';
} elseif (strpos($name, 'client_') === 0) {
// 终端
if ($domain) {
$url = dr_http_prefix($domain) . '/api.php';
}
$cname = '终端';
}
if ($url && $cname) {
$code = dr_catcher_data($url, 5, false);
if ($code != 'phpcmf ok') {
$error[] = dr_lang('[%s]域名绑定异常,无法访问:%s,可以尝试手动访问此地址,如果提示phpcmf ok就表示成功', dr_lang($cname), $url);
}
}
}
}
// 验证附件域名
list($a, $b) = dr_thumb_path();
list($c, $d) = dr_avatar_path();
$domain = [
['name' => dr_lang('附件域名'), 'path' => SYS_UPLOAD_PATH, 'url' => SYS_UPLOAD_URL],
['name' => dr_lang('缩略图域名'), 'path' => $a, 'url' => $b],
['name' => dr_lang('头像域名'), 'path' => $c, 'url' => $d],
];
foreach ($domain as $t) {
if (!file_put_contents($t['path'].'api.html', 'phpcmf ok')) {
$this->_json(0, (IS_DEV ? $t['path'] : dr_safe_replace_path($t['path'])).' '.dr_lang('无法写入文件'));
}
$code = dr_catcher_data($t['url'].'api.html', 5, false);
if ($code != 'phpcmf ok') {
$error[] = dr_lang('[%s]异常,无法访问:%s,可以尝试手动访问此地址,如果提示phpcmf ok就表示成功', $t['name'], $t['url'].'api.html');
}
}
// 重复验证
if (is_file(WRITEPATH.'config/domain_sso.php')) {
$domains = require WRITEPATH.'config/domain_sso.php';
if ($domains) {
// 获取去掉重复数据的数组
$unique_arr = array_unique ( $domains );
// 获取重复数据的数组
$repeat_arr = array_diff_assoc ( $domains, $unique_arr );
if ($repeat_arr) {
foreach ($repeat_arr as $t) {
$error[] = dr_lang('域名【%s】被多处重复配置,可能会影响到此域名的作用域或访问异常', $t);
}
}
}
}
if ($error) {
$this->_json(0, implode('
', $error));
} elseif ($tips) {
$this->_json(1, implode('
', $tips));
} else {
$this->_json(1, dr_lang(dr_lang('完成')));
}
break;
case '12':
// https
if (SYS_HTTPS) {
if (strpos(FC_NOW_URL, 'https://') !== false) {
$this->_json(1,dr_lang('正常'));
} else {
$this->_json(0,''.dr_lang('服务器无法识别HTTPS证书,查看解决方案').'');
}
} else {
$this->_json(0,''.dr_lang('系统没有开启HTTPS服务,查看解决方案').'');
}
break;
case '13':
// 应用插件
$func = [];
$local = \Phpcmf\Service::Apps();
$custom = file_get_contents(CONFIGPATH.'custom.php');
foreach ($local as $dir => $path) {
if (is_file($path.'Config/App.php')) {
// 变量重定义
if (is_file($path.'Config/Init.php')) {
$code = file_get_contents($path.'Config/Init.php');
if (preg_match_all("/\s+function (.+)\(/", $code, $arr)) {
foreach ($arr[1] as $a) {
$name = trim($a);
if (strpos($name, "'") !== false) {
continue;
}
if (isset($func[$name]) && $func[$name]) {
$this->_json(0,dr_lang('应用[%s]中的函数[%s]存在于%s之中,不能被重复定义', $dir, $name, $func[$name]));
}
$func[$name] = $dir;
if (function_exists($name)) {
if (preg_match("/\s+function ".$name."\(/", $custom)) {
// 存在于自定义函数库中
} else {
$this->_json(0, dr_lang('应用[%s]中的函数[%s]是系统函数,不能定义', $dir, $name));
}
}
}
}
}
//
}
}
if (!is_file(ROOTPATH.'static/assets/js/my.js') && is_dir(ROOTPATH.'static/assets/js/')) {
@file_put_contents(ROOTPATH.'static/assets/js/my.js', '');
}
$this->_json(1, dr_lang(dr_lang('完成')));
break;
case '14':
// 移动端检测
$error = [];
// 开起自动识别,又开启了首页静态
if ($this->site_info[SITE_ID]['SITE_AUTO'] && $this->site_info[SITE_ID]['SITE_INDEX_HTML']) {
$error[] = ''.dr_lang('当前站点已经开启[首页静态]模式,将无法实现移动端自动跳转功能,查看解决方案').'';
}
$config = $this->get_cache('site', SITE_ID, 'mobile');
if (!$this->site_info[SITE_ID]['SITE_IS_MOBILE'] && $config && $config['tohtml']) {
$error[] = ''.dr_lang('当前站点没有绑定移动端域名,将无法实现移动端静态页面功能,查看解决方案').'';
}
if ($error) {
$this->_json(0, implode('
', $error));
}
// 单独域名判断
if (!$this->site_info[SITE_ID]['SITE_IS_MOBILE']) {
$this->_json(1,dr_lang('当前项目没有绑定移动端域名'));
}
$this->_json(1, dr_lang(dr_lang('完成')));
break;
case '15':
// 服务器环境
if (is_file(ROOTPATH.'test.php')) {
$error[] = dr_lang('根目录检测文件test.php,当项目正式上线后需要删除,以免影响网站安全');
}
if (IS_DEV) {
$error[] = dr_lang('根目录index.php中的开发者模式已开启,当项目正式上线后需要关闭,以免影响网站安全');
}
if ($error) {
$this->_json(0, implode('
', $error));
}
$this->_json(1, dr_lang(dr_lang('完成')));
break;
case '16':
// 自动任务检测
if (is_file(WRITEPATH.'config/run_time.php')) {
$time = file_get_contents(WRITEPATH.'config/run_time.php');
$this->_json(1, dr_lang('最近执行时间:%s', $time));
}
$this->_json(0, ''.dr_lang('没有配置自动任务功能,无法自动清理缓存和更新缓存,查看解决方案').'');
break;
case '99':
break;
}
$this->_json(1, dr_lang(dr_lang('完成')));
}
public function php_index() {
phpinfo();
}
public function server_index() {
echo '';
print_r($_SERVER);
}
private function halt($msg, $code) {
$this->_json($code, $msg);
}
private function _check_table_counts($table, $name) {
$ptable = \Phpcmf\Service::M()->dbprefix($table);
if (!\Phpcmf\Service::M()->db->tableExists($ptable)) {
return dr_lang('数据表【%s】不存在,请创建', $name.'/'.$ptable);
}
$counts = \Phpcmf\Service::M()->table($table)->counts();
if ($counts > 1000000) {
return ''.dr_lang('数据表【%s】数据量超过100万,会影响加载速度,建议对其进行数据优化', $name.'/'.$ptable).'';
}
}
}