_json(0, dr_lang('缩略图目录异常,请手动清理:%s', $cache_path)); } dr_dir_delete($cache_path); dr_mkdirs($cache_path); \Phpcmf\Service::C()->_json(1, dr_lang('清理完成'), 1); } // 清理日志文件 public function update_log() { foreach ([ WRITEPATH.'log/', WRITEPATH.'debugbar/', WRITEPATH.'debuglog/', WRITEPATH.'error/', WRITEPATH.'database/Sql/', ] as $t) { if (is_dir($t)) { dr_dir_delete($t); dr_mkdirs($t); } } foreach ([ WRITEPATH.'email_log.txt', WRITEPATH.'sms_log.txt', ] as $t) { if (is_file($t)) { unlink($t); } } \Phpcmf\Service::C()->_json(1, dr_lang('清理完成'), 1); } // 更新自定义路由 public function update_rewrite_routes() { dr_dir_delete(WRITEPATH.'route/'); \Phpcmf\Hooks::trigger('update_rewrite_routes'); \Phpcmf\Service::C()->_json(1, dr_lang('执行完成,请更新其他地方的URL地址'), 1); } // 更新附件缓存 public function update_attachment() { $page = intval($_GET['page']); if (!$page) { dr_dir_delete(WRITEPATH.'attach'); dr_mkdirs(WRITEPATH.'attach'); /*不清理缩略图文件是因为静态页面会导致缩略图404的悲剧 list($cache_path) = dr_thumb_path(); dr_dir_delete($cache_path); dr_mkdirs($cache_path);*/ \Phpcmf\Service::C()->_json(1, dr_lang('正在检查附件'), 1); } $total = $this->table('attachment')->counts(); if (!$total) { \Phpcmf\Service::C()->_json(1, dr_lang('无可用附件更新'), 0); } $psize = 300; $tpage = ceil($total/$psize); $result = $this->db->table('attachment')->orderBy('id ASC')->limit($psize, $psize * ($page - 1))->get()->getResultArray(); if ($result) { foreach ($result as $t) { \Phpcmf\Service::C()->get_attachment($t['id']); } } if ($page > $tpage) { \Phpcmf\Service::C()->_json(1, dr_lang('已更新%s个附件', $total), 0); } \Phpcmf\Service::C()->_json(1, dr_lang('正在更新中(%s/%s)', $page, $tpage), $page + 1); } // 同步更新缓存 // \Phpcmf\Service::M('cache')->sync_cache(); $is_site 表示是否作为项目来更新缓存 public function sync_cache($name = '', $namepspace = '', $is_site_param = 0) { \Phpcmf\Hooks::trigger('update_cache'); if (!$this->is_sync_cache) { $this->site_cache = $this->table('site')->where('disabled', 0)->getAll(); if (dr_is_use_module()) { $this->module_cache = $this->table('module')->order_by('displayorder ASC,id ASC')->getAll(); \Phpcmf\Service::M('site', 'module')->cache(0, $this->site_cache, $this->module_cache); } else { \Phpcmf\Service::M('site')->cache(0, $this->site_cache); } } if ($name) { if (!$is_site_param) { // 普通缓存执行 \Phpcmf\Service::M($name, $namepspace)->cache(); } else { // 传入项目参数 \Phpcmf\Service::M($name, $namepspace)->cache(SITE_ID); } } \Phpcmf\Service::M('table')->cache(SITE_ID, $this->module_cache); if ($this->module_cache) { \Phpcmf\Service::M('module')->cache(SITE_ID, $this->module_cache); } \Phpcmf\Service::M('menu')->cache(); if (!$this->is_sync_cache) { $this->is_sync_cache = 1; } $this->update_data_cache(); } // 更新数据结构 public function update_db() { // 执行插件自己的更新程序 $local = \Phpcmf\Service::Apps(); foreach ($local as $dir => $path) { if (!is_file($path.'install.lock')) { continue; } if (is_file($path.'Config/Update.php')) { require $path.'Config/Update.php'; } // 更新新增菜单 \Phpcmf\Service::M('menu')->update_app($dir); } } // 更新全部项目缓存 public function update_site_cache() { \Phpcmf\Hooks::trigger('update_cache'); if (dr_is_use_module()) { if (is_file(IS_USE_MODULE.'Models/Site.php')) { \Phpcmf\Service::M('site', 'module')->update_site_cache(); } else { \Phpcmf\Service::C()->_json(0, dr_lang('请升级建站系统插件')); } } else { // 按项目更新的缓存 $cache = []; if (is_file(MYPATH.'/Config/Cache.php')) { $_cache = require MYPATH.'/Config/Cache.php'; $_cache && $cache = dr_array22array($cache, $_cache); } // 执行插件自己的缓存程序 $local = \Phpcmf\Service::Apps(); $app_cache = []; foreach ($local as $dir => $path) { if (!is_file($path.'install.lock')) { continue; } if (is_file($path.'Config/Cache.php')) { $_cache = require $path.'Config/Cache.php'; $_cache && $app_cache[$dir] = $_cache; } // 更新新增菜单 \Phpcmf\Service::M('menu')->update_app($dir); } //dr_dir_delete(WRITEPATH.'data'); foreach (['auth', 'email', 'member', 'attachment', 'system', 'site'] as $m) { \Phpcmf\Service::M($m)->cache(); } // 自定义缓存 foreach ($cache as $m => $namespace) { \Phpcmf\Service::M($m, $namespace)->cache(1); } // 插件缓存 $apps = []; if ($app_cache) { foreach ($app_cache as $namespace => $c) { \Phpcmf\Service::C()->init_file($namespace); foreach ($c as $i => $apt) { $class = is_numeric($i) ? $apt : $i; $apps[] = '['.$namespace.'-'.$class.']'; \Phpcmf\Service::M($class, $namespace)->cache(1); } } } // 记录日志 CI_DEBUG && \Phpcmf\Service::L('input')->system_log('更新缓存:'.implode(' - ', $apps)); \Phpcmf\Service::C()->_json(1, dr_lang('更新完成')); } } // 更新当前项目缓存 public function update_cache() { \Phpcmf\Hooks::trigger('update_cache'); dr_dir_delete(WRITEPATH.'tree'); if (dr_is_use_module()) { if (is_file(IS_USE_MODULE.'Models/Site.php')) { \Phpcmf\Service::M('site', 'module')->update_cache(); } else { \Phpcmf\Service::C()->_json(0, dr_lang('请升级建站系统插件')); } } else { // 全局缓存 foreach (['auth', 'email', 'member', 'attachment', 'system', 'site'] as $m) { \Phpcmf\Service::M($m)->cache(); } // 按项目更新的缓存 $cache = []; if (is_file(MYPATH.'/Config/Cache.php')) { $_cache = require MYPATH.'/Config/Cache.php'; $_cache && $cache = dr_array22array($cache, $_cache); } // 执行插件自己的缓存程序 $local = \Phpcmf\Service::Apps(); $app_cache = []; foreach ($local as $dir => $path) { if (!is_file($path.'install.lock')) { continue; } if (is_file($path.'Config/Cache.php')) { $_cache = require $path.'Config/Cache.php'; $_cache && $app_cache[$dir] = $_cache; } // 更新新增菜单 \Phpcmf\Service::M('menu')->update_app($dir); } // 插件缓存 $apps = []; if ($app_cache) { foreach ($app_cache as $namespace => $c) { \Phpcmf\Service::C()->init_file($namespace); foreach ($c as $i => $apt) { $class = is_numeric($i) ? $apt : $i; $apps[] = '['.$namespace.'-'.$class.']'; \Phpcmf\Service::M($class, $namespace)->cache(1); } } } // 记录日志 CI_DEBUG && \Phpcmf\Service::L('input')->system_log('更新缓存:'.implode(' - ', $apps)); \Phpcmf\Service::M('table')->cache(1, []); \Phpcmf\Service::M('menu')->cache(); } } // 更新数据 $all表示是否强制更新缓存 public function update_data_cache($all = false) { if ($all or !SYS_CACHE_CLEAR) { // 清空系统缓存 \Phpcmf\Service::L('cache')->init()->clean(); // 清空文件缓存 \Phpcmf\Service::L('cache')->init('file')->clean(); // 递归删除文件 $path = [ WRITEPATH.'file', WRITEPATH.'template', WRITEPATH.'debugbar', ]; // 默认文件内容 $cache_index = ' Require all denied Deny from all '; // 开始删除目录数据 foreach ($path as $p) { dr_dir_delete($p); mkdir($p, 0777); file_put_contents($p.'/.htaccess', $cache_index); } } // 删除缓存保留24小时内的文件 $path = [ WRITEPATH.'authcode', WRITEPATH.'debugbar', WRITEPATH.'session', WRITEPATH.'thread', WRITEPATH.'temp', ]; foreach ($path as $p) { if ($fp = opendir($p)) { while (FALSE !== ($file = readdir($fp))) { if ($file === '.' OR $file === '..' OR $file === 'index.html' OR $file === '.htaccess' OR $file[0] === '.' OR !is_file($p.'/'.$file) OR SYS_TIME - filemtime($p.'/'.$file) < 3600 * 24 // 保留24小时内的文件 ) { continue; } unlink($p.'/'.$file); } file_put_contents($p.'/.htaccess', $cache_index); } } // 删除首页静态文件 if (isset(\Phpcmf\Service::C()->site_info[SITE_ID]['SITE_INDEX_HTML']) && \Phpcmf\Service::C()->site_info[SITE_ID]['SITE_INDEX_HTML']) { unlink(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'index.html')); unlink(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', SITE_MOBILE_DIR.'/index.html')); } @unlink(WRITEPATH.'config/run_lock.php'); // 重置Zend OPcache function_exists('opcache_reset') && opcache_reset(); } // 编辑器更新 public function update_ueditor() { $site = $this->table('site')->where('disabled', 0)->getAll(); foreach ($site as $t) { $t['setting'] = dr_string2array($t['setting']); if ($t['id'] > 1 && $t['setting']['webpath']) { $path = rtrim($t['setting']['webpath'], '/').'/'; } else { $path = WEBPATH; } // 复制百度编辑器到当前目录 $this->cp_ueditor_file($path); // 复制百度编辑器到移动端项目 $this->cp_ueditor_file($path.'mobile/'); if ($t['setting']['client']) { foreach ($t['setting']['client'] as $c) { if ($c['name'] && $c['domain']) { // 复制百度编辑器到当前目录 $this->cp_ueditor_file($path.$c['name'].'/'); } } } } // 为后台域名移动编辑器目录 if (dr_is_app('safe')) { $safe = \Phpcmf\Service::M('app')->get_config('safe'); if ($safe) { foreach ($safe as $key => $path) { if (is_string($path) && is_numeric($key) && is_dir($path)) { $this->cp_ueditor_file($path.'/'); } } } } } // 复制编辑器 public function cp_ueditor_file($path) { $npath = $path.'api/ueditor/'; if (!is_file($npath.'ueditor.config.js')) { return; } dr_mkdirs($npath); \Phpcmf\Service::L('file')->copy_dir(ROOTPATH.'api/ueditor/dialogs/', ROOTPATH.'api/ueditor/dialogs/', $npath.'dialogs/'); \Phpcmf\Service::L('file')->copy_dir(ROOTPATH.'api/ueditor/third-party/', ROOTPATH.'api/ueditor/third-party/', $npath.'third-party/'); } public function update_search_index() { if (IS_USE_MODULE) { \Phpcmf\Service::M('site', 'module')->update_search_index(); } } // 重建子站配置文件 public function update_site_config() { if (IS_USE_MODULE) { \Phpcmf\Service::M('site', 'module')->update_site_config(); } } // 生成目录式手机目录 public function update_mobile_webpath($path, $dirname) { if (IS_USE_MODULE) { \Phpcmf\Service::M('site', 'module')->update_mobile_webpath($path, $dirname); } } // 更新项目 public function update_webpath($name, $path, $value, $root = TEMPPATH) { if (IS_USE_MODULE) { \Phpcmf\Service::M('site', 'module')->update_webpath($name, $path, $value, $root); } } // 错误输出 public function _error_msg($msg) { echo dr_array2string(dr_return_data(0, $msg));exit; } }