前置准备
本指南适配PHPCMS V9全版本(含GBK、UTF-8编码),操作前需完成以下准备工作,避免操作失误导致数据丢失:
- 备份采集规则配置文件:通过FTP/宝塔文件管理器下载
/caches/configs/collection.php存到本地
- 备份采集数据表,执行以下MySQL命令(替换对应参数即可):
```
mysqldump -u 你的数据库用户名 -p 你的数据库名 v9_collection > /自定义备份路径/collection_bak.sql
```
- 登录PHPCMS后台,地址为
你的站点域名/admin.php,输入超级管理员账号密码进入系统
方案1:单节点重复过滤配置(零代码)
适用于仅需要单个采集节点内部过滤重复内容的场景,无需修改任何代码,1分钟即可配置完成:
- 进入后台左侧菜单【内容】-【采集管理】-【采集节点管理】,找到需要配置的采集节点,点击右侧修改按钮
- 下拉页面到最底部的高级设置板块,找到「重复内容判断依据」选项,根据需求选择对应规则:
- 标题相同:仅判断采集到的标题与已采集内容是否一致,适合内容高度标准化的场景
- 内容相同:仅判断正文内容是否一致,适合标题可能重复但内容不同的场景
- 标题+内容相同:同时匹配标题和正文,过滤精度最高,推荐绝大多数场景使用
- 找到「重复内容处理方式」选项,根据需求选择:
- 不采集:检测到重复内容直接跳过,适合需要保留原有内容不变的场景
- 更新已有内容:检测到重复内容时用新采集的内容覆盖原有内容,适合需要同步源站更新的场景
- 必须勾选「启用重复校验」前面的复选框,否则以上配置全部不生效,最后点击底部「确定」保存节点配置即可
方案2:跨节点全局重复过滤配置(仅改1行代码)
适用于多个采集节点采集同源内容,需要全站范围过滤重复的场景,仅需修改1行核心代码即可实现:
- 通过文件管理器打开路径
/phpcms/modules/collection/collection.class.php文件
- 找到公共函数
public function _check_exist($title, $content = '', $url = ''),定位到以下原始代码:
```php
$where = "`siteid` = '$this->siteid' AND `nodeid` = '$this->nodeid' AND ";
```
- 删除代码中的节点ID判断条件,修改为以下内容:
```php
$where = "`siteid` = '$this->siteid' AND ";
```
- 保存修改后的文件,回到后台点击左侧菜单【设置】-【更新缓存】,全选所有缓存选项点击确定完成更新

配置完成后,所有采集节点共用同一套重复判断规则,任意节点采集到全站已存在的内容都会按配置的规则处理。
方案3:自定义字段重复过滤配置(适配个性化需求)
适用于需要通过来源URL、源站文章ID等自定义字段判断重复的场景,步骤如下:
- 如果需要用到数据库不存在的自定义字段(如源站文章ID),先执行SQL语句给采集表加对应字段,示例为添加source_id字段:
```sql
ALTER TABLE `v9_collection` ADD COLUMN `source_id` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '源站文章ID' AFTER `url`;
```
- 进入采集节点修改页面,打开【内容页规则】板块,添加对应自定义字段的采集规则,确保能正常采集到字段值
- 再次打开
/phpcms/modules/collection/collection.class.php文件的_check_exist函数,找到重复判断逻辑的原始代码:
```php
if($this->setting['repeat_type'] == 1) {
$where .= "`title` = '".addslashes($title)."'";
} elseif($this->setting['repeat_type'] == 2) {
$where .= "`content` = '".addslashes($content)."'";
} elseif($this->setting['repeat_type'] == 3) {
$where .= "`title` = '".addslashes($title)."' AND `content` = '".addslashes($content)."'";
}
```
- 修改判断逻辑,加入自定义字段的判断,示例为优先用来源URL判断重复的代码:
```php
// 优先判断来源URL是否重复
if(!empty($url)) {
$where .= "`url` = '".addslashes($url)."'";
} else {
// URL为空时沿用原有判断规则
if($this->setting['repeat_type'] == 1) {
$where .= "`title` = '".addslashes($title)."'";
} elseif($this->setting['repeat_type'] == 2) {
$where .= "`content` = '".addslashes($content)."'";
} elseif($this->setting['repeat_type'] == 3) {
$where .= "`title` = '".addslashes($title)."' AND `content` = '".addslashes($content)."'";
}
}
```
如果需要用自定义的source_id判断,只需将URL判断部分替换为
$where .= "`source_id` = '".addslashes($source_id)."';即可
- 保存文件后更新全站缓存,配置生效
效果验证与异常排查
效果验证步骤
- 单节点验证:进入采集节点点击【测试采集】,选择3条已经采集过的内容发起采集,若采集结果显示内容重复,已跳过则配置生效
- 跨节点验证:用两个不同的采集节点采集同一篇内容,若第二个节点采集时提示重复则全局过滤生效
- 自定义字段验证:测试采集时查看字段采集结果是否有值,重复内容是否被正常过滤即可
常见异常排查
- 配置后仍采集重复内容:首先检查采集节点是否勾选了启用重复校验,其次确认是否更新了全站缓存,最后检查修改的是否为
/phpcms/modules/collection/下的源文件,而非缓存目录下的文件
- 误判正常内容为重复:检查重复判断依据是否设置过松,比如仅用标题判断可能出现不同内容同标题的情况,切换为标题+内容或自定义URL/ID判断即可解决
- 采集时提示SQL错误:检查修改的代码中SQL语句是否存在引号未闭合、字段名与数据库不一致的问题,还原备份的文件即可恢复正常
- 自定义字段判断不生效:先检查数据库是否成功添加对应字段,再检查采集节点的内容规则是否能正常采集到该字段的值即可
注意:所有文件修改时需用UTF-8无BOM编码保存,避免出现乱码问题,修改前务必提前备份文件和数据,防止操作失误导致功能异常。