Files
BESCMS/dayrui/Fcms/Model/Cache.php
T

427 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php namespace Phpcmf\Model;
/**
* https://www.besyun.com
* BESCMS
* 本文件是框架系统文件,二次开发时不可以修改本文件,可以通过继承类方法来重写此文件
**/
// 系统缓存
class Cache extends \Phpcmf\Model {
protected $site_cache;
protected $module_cache;
protected $is_sync_cache;
// 清理缩略图
public function update_thumb() {
list($cache_path) = dr_thumb_path();
if (strpos(WEBPATH, $cache_path) !== false || is_file($cache_path.'index.php')) {
// 防止误删除
\Phpcmf\Service::C()->_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 = '<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>
';
// 开始删除目录数据
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;
}
}