xiao9469 发表于 2021-12-16 15:35:23

dz后台设置的词语过滤不起效果了

common_word 表数据是有的./source/class/discuz/discuz_censor.php 文件中
public function __construct() {    global $_G;    loadcache(array('censor', 'bbcodes_display'));    $this->censor_words = !empty($_G['cache']['censor']) ? $_G['cache']['censor'] : array();    $this->bbcodes_display = $_G['cache']['bbcodes_display'][$_G['groupid']];但是 $this->censor_words 获取到的内容是空数组


想问下 $_G['cache']['censor'] 这个数组在哪可以查看和设置,更新过缓存也没用

Discuz智能体 发表于 2025-3-20 23:49:30

在Discuz!中,`$_G` 是一个全局变量数组,包含了系统运行时的各种配置和数据。`$_G` 数组的内容通常是通过 `loadcache()` 函数加载的缓存数据。你提到的问题是关于词语过滤不起作用,并且 `$_G` 数组中的 `censor` 数据为空。以下是一些可能的原因和解决方法:

### 1. 检查缓存是否正确加载
`$_G` 数组中的 `censor` 数据是通过 `loadcache('censor')` 加载的。如果 `censor` 缓存没有正确加载,可能会导致 `$_G['censor']` 为空。

你可以尝试手动更新缓存:
- 进入Discuz!后台 -> 工具 -> 更新缓存,确保所有缓存都已更新。
- 你也可以通过代码手动更新缓存:
loadcache('censor');

### 2. 检查 `common_word` 表数据
确保 `common_word` 表中有正确的过滤词数据。你可以通过数据库管理工具(如phpMyAdmin)直接查看 `common_word` 表,确保数据存在且格式正确。

### 3. 检查 `censor` 缓存生成逻辑
`censor` 缓存是通过 `source/class/table/table_common_word.php` 中的 `fetch_all_by_type()` 方法生成的。你可以检查这个方法是否正常工作,确保缓存数据能够正确生成。

### 4. 检查 `discuz_censor.php` 文件
你提到的 `discuz_censor.php` 文件中的 `__construct()` 方法,确保 `$_G['censor']` 被正确赋值。你可以尝试在 `__construct()` 方法中添加调试代码,检查 `$_G['censor']` 是否被正确加载:
public function __construct() {
    global $_G;
    loadcache(array('censor', 'bbcodes_display'));
    $this->censor_words = !empty($_G['censor']) ? $_G['censor'] : array();
    $this->bbcodes_display = $_G['bbcodes_display'];
   
    // 调试代码
    print_r($_G['censor']);
    exit;
}

### 5. 检查插件或模板冲突
有时候,某些插件或模板可能会修改 `$_G` 数组的内容,导致 `censor` 数据丢失。你可以尝试禁用所有插件,切换到默认模板,看看问题是否依然存在。

### 6. 检查文件权限
确保 `data/cache/` 目录及其子目录有正确的写入权限,以便系统能够正常生成缓存文件。

### 7. 检查 `config_global.php` 配置
确保 `config_global.php` 中的缓存配置正确,特别是 `$_config['cache']['type']` 和 `$_config['cache']['cachedir']`。

### 8. 手动更新 `censor` 缓存
如果以上方法都无效,你可以尝试手动更新 `censor` 缓存:
C::t('common_word')->updatecache();

### 总结
通过以上步骤,你应该能够找到 `$_G['censor']` 为空的原因并解决问题。如果问题依然存在,建议进一步检查系统日志或联系专业开发者进行排查。

如果你有其他问题或需要进一步的帮助,请随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-22 10:07:18

在Discuz!中,`$_G` 是一个全局变量数组,包含了当前站点的各种配置和缓存数据。你提到的 `$_G['cache']['censor']` 是存储词语过滤规则的地方。如果 `$_G['cache']['censor']` 是空的,那么词语过滤功能就无法正常工作。

### 1. 检查缓存是否正常加载
首先,确保缓存已经正确加载。你可以在 `source/class/discuz/discuz_censor.php` 文件中添加一些调试代码,检查 `$_G['cache']['censor']` 是否为空。

public function __construct() {
    global $_G;
    loadcache(array('censor', 'bbcodes_display'));
   
    // 调试代码
    if (empty($_G['cache']['censor'])) {
      echo "censor cache is empty!";
      exit;
    }
   
    $this->censor_words = !empty($_G['cache']['censor']) ? $_G['cache']['censor'] : array();
    $this->bbcodes_display = $_G['cache']['bbcodes_display'];
}

如果输出 `censor cache is empty!`,说明缓存没有正确加载。

### 2. 手动更新缓存
你可以尝试手动更新缓存,确保 `censor` 缓存被正确加载。

- 进入Discuz!后台,找到 `工具` -> `更新缓存`,然后点击 `更新缓存` 按钮。
- 或者通过命令行工具更新缓存(如果你有命令行访问权限):

php /path/to/discuz/script/update_cache.php

### 3. 检查 `common_word` 表
确保 `common_word` 表中有数据,并且数据格式正确。你可以通过数据库管理工具(如phpMyAdmin)查看 `common_word` 表的内容。

### 4. 检查 `censor` 缓存的生成逻辑
如果缓存更新后仍然无效,可以检查 `source/function/cache/cache_censor.php` 文件,确保缓存生成逻辑没有问题。

function build_cache_censor() {
    $data = array();
    $query = DB::query("SELECT * FROM ".DB::table('common_word')." WHERE type IN ('banned', 'mod', 'filter')");
    while($word = DB::fetch($query)) {
      $data[$word['type']][$word['find']] = $word['replacement'];
    }
    save_syscache('censor', $data);
}

### 5. 检查 `$_G` 数组的初始化
`$_G` 数组是在 `source/class/discuz/discuz_application.php` 文件中初始化的。你可以检查这个文件,确保 `$_G` 数组的初始化逻辑没有问题。

### 6. 检查插件冲突
如果你安装了某些插件,可能会影响到 `$_G` 数组的初始化或缓存加载。尝试禁用所有插件,看看问题是否依然存在。

### 7. 检查文件权限
确保 `data/cache` 目录及其子目录有正确的写入权限,以便缓存文件能够正常生成。

### 8. 检查服务器环境
如果以上方法都无效,可能是服务器环境问题。检查PHP版本、内存限制、文件权限等,确保它们符合Discuz!的要求。

### 总结
通过以上步骤,你应该能够找到 `$_G['cache']['censor']` 为空的原因。如果问题依然存在,建议在DZ插件网(https://www.dz-x.net/)上寻求更多帮助,或者查看相关文档和社区讨论。

希望这些建议能帮助你解决问题!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: dz后台设置的词语过滤不起效果了