XYHCMS v3.5 轻量级CMS源码安装配置与二次开发实战指南
简介XYHCMS网站管理系统 v3.5 bulid0518 是一套面向个人博客、企业建站及个性化网站场景的开源内容管理系统适合具备一定 PHP 基础的开发者与站长使用。系统基于 PHP MySQL 构建采用 MVC 分层设计将数据处理、界面展示与控制逻辑分离便于二次开发与后期迭代后台管理界面直观非技术用户也能完成内容发布与页面设置并集成防 SQL 注入、XSS 攻击及角色权限管理等安全机制。压缩包为 zip 格式整体约 8.67MB内含系统源码包及说明文档、下载指引等辅助文件解压后即可按说明完成安装配置。目前已有 156 人浏览学习可作为快速搭建中小型网站、研究 CMS 架构与定制扩展的实用参考。1. 从一份老牌 CMS 源码说起XYHCMS v3.5 到底能解决什么问题如果你手头有一个闲置的虚拟主机、一台低配云服务器或者只是想在本地快速搭一个能跑起来的内容站点XYHCMS 网站管理系统 v3.5 build0518 这类轻量级 CMS 源码包往往比那些动辄几十兆、依赖一堆扩展的现代框架更省心。它的定位很明确给中小型站点、企业展示站、个人博客或内部信息页提供一个开箱即用的后台管理加前台渲染方案。你不需要从零写路由、写权限、写模板引擎解压、配数据库、跑安装向导十几分钟就能看到一个带登录后台的完整站点。适合谁适合想快速交付展示型站点的外包开发者、需要给客户一个低成本可维护后台的建站从业者以及想拆一套 PHP CMS 源码来学习传统 MVC 分层写法的同学。它不追求高并发和复杂业务编排追求的是“能跑、能改、能维护”。2. 环境准备与安装把源码跑起来需要几步2.1 运行环境与依赖清单XYHCMS 这类传统 PHP CMS核心依赖通常集中在 PHP 加 MySQL 加 Web 服务器三件套上。v3.5 这个版本号对应的年代PHP 5.6 到 7.2 之间兼容性最好MySQL 用 5.5 到 5.7 的 InnoDB 引擎足够。Web 服务器用 Apache 或 Nginx 都行Apache 下一般自带 .htaccess 伪静态规则Nginx 需要自己转写 rewrite。常见做法是本地用 phpStudy 或 XAMPP 这类集成环境先跑通再往线上迁。需要确认的 PHP 扩展不多但缺一个就白屏mysqli 或 pdo_mysql看源码用的哪种连接方式、gd验证码和缩略图、mbstring中文截取、curl远程请求部分采集或更新检查会用到。我一般会先写一个 phpinfo 探针丢到根目录跑一遍看扩展齐不齐再删掉。组件推荐版本说明PHP5.6 / 7.0 / 7.27.4 以上部分函数废弃会报错MySQL5.5 - 5.7字符集用 utf8 或 utf8mb4Web 服务器Apache 2.4 / Nginx 1.14Apache 需开启 rewrite必需扩展mysqli、gd、mbstring缺一不可2.2 安装向导与数据库配置把源码包解压到站点根目录后先别急着访问。检查一下目录权限Linux 下 runtime、uploads、data 这类目录要给写权限否则安装到写配置文件那一步会卡住。Windows 本地环境一般不用管权限但要注意路径里别带中文和空格。# Linux 下给关键目录写权限用户组按实际 Web 运行用户调整 chmod -R 755 /www/xyhcms chown -R www:www /www/xyhcms chmod -R 777 /www/xyhcms/runtime chmod -R 777 /www/xyhcms/uploads chmod -R 777 /www/xyhcms/data上面这几条命令的逻辑是整体给 755 保证可读可执行再把运行时会写入的 runtime、uploads、data 单独放开到 777。参数说明www:www是 Web 服务运行用户Nginx 常见是www-data或nginxApache 常见是apache或www用ps aux | grep nginx能查到实际用户。权限给错的表现是安装向导报“目录不可写”但页面不一定告诉你具体哪个目录得自己逐个排查。接着浏览器访问站点域名或本地地址会自动跳到 install 安装页。填写数据库地址本地一般 localhost、库名、用户名、密码、表前缀。表前缀建议改掉默认的别用xyh_这种一眼能猜到的降低被批量扫描的风险。管理员账号密码在这一步设置密码别用弱口令后台入口路径安装完最好也改一下。// 安装完成后config 或 data 目录下会生成类似 database.php 的配置文件 // 典型内容结构如下确认连接参数是否正确 return [ hostname 127.0.0.1, database xyhcms_db, username db_user, password your_password, hostport 3306, prefix my_, charset utf8, ];这段配置是安装向导自动写入的逻辑说明hostname 用 127.0.0.1 比 localhost 在某些环境下更稳避免 socket 连接问题prefix 就是刚才设的表前缀charset 如果站点要存 emoji 或特殊字符得改成 utf8mb4同时数据库和表也要对应改。参数改完保存访问前台首页能看到默认模板渲染出来的页面说明安装成功。2.3 伪静态与后台入口安装完第一件事是配伪静态否则内页 URL 会带一长串参数既不好看也不利于收录。Apache 环境下源码包一般带 .htaccess确认AllowOverride All已开启即可。Nginx 需要手动加 rewrite 规则常见做法是把请求转发到 index.php。# Nginx 伪静态配置片段放在 server 块内 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1 last; } }逻辑说明!-e $request_filename判断请求的文件或目录是否真实存在不存在才转发给 index.php避免把静态资源也吞掉。参数s$1是常见 CMS 的路由参数名具体看源码里入口文件怎么接的有的用s有的用r对不上就 404。改完nginx -t测试配置再nginx -s reload重载。后台入口一般在/admin.php或/admin/下安装完先登录一遍确认账号能进。然后立刻做两件事改后台路径重命名入口文件或目录、关掉安装目录把 install 文件夹删掉或改名。这两步不做等于把门钥匙插在门上。3. 目录结构与模板机制改哪里、怎么改不翻车3.1 核心目录职责划分拆一套 CMS 源码第一步永远是看目录结构它决定了你改代码时该动哪个文件。XYHCMS 这类系统通常遵循“入口 应用 公共 模板 上传”的分法虽然不同版本命名有差异但职责大同小异。目录职责改动频率index.php / admin.php前台与后台入口低application / app控制器、模型、业务逻辑中template / theme前台模板文件高static / publicCSS、JS、图片中uploads用户上传文件不手动改runtime / cache编译缓存、日志不手动改data / config配置文件、安装锁低常见做法是前台样式和结构改动只碰 template 和 static业务逻辑改动才进 application。很多人翻车是因为直接改了 runtime 里的编译文件结果系统一清缓存全没了。记住一条runtime 和 cache 目录里的东西都是生成物不是源码改了白改。3.2 模板标签与变量调用传统 CMS 的模板机制核心是“标签替换”或“模板引擎”。XYHCMS 前台模板里通常能看到类似{dede:arclist}或{$list.title}这种写法前者是自定义标签解析后者是模板引擎变量输出。改模板前先找到模板目录下的首页文件一般是index.html或index.htm看里面变量命名规律。!-- 模板中常见的列表循环写法具体标签名以源码为准 -- {volist namelist idvo} li a href{$vo.url}{$vo.title}/a span{$vo.createtime|dateY-m-d,###}/span /li {/volist}逻辑说明volist是循环标签name指定数据源变量id是单条记录的别名。{$vo.url}输出链接{$vo.title}输出标题|dateY-m-d,###是模板函数调用把时间戳格式化。参数怎么改想加字段就在循环体里加{$vo.字段名}字段名要和数据库表里的列名一致不一致就输出空。改完模板如果没生效先清 runtime 缓存再看模板文件是不是被编译过。3.3 新增一个自定义页面模板实际交付里最常见的需求是“加一个单页比如关于我们但样式要和首页不一样”。步骤不复杂但顺序错了就白干。第一步在模板目录下复制一份现有模板文件比如把index.html复制成page_about.html改掉里面不需要的循环块换成静态内容加少量变量。第二步进后台找到“单页”或“栏目”管理新增一个栏目类型选单页模板名填page_about系统会去模板目录找page_about.html。第三步如果后台没有模板选择项就得改控制器或路由配置让某个 URL 指向这个模板。这一步因源码而异常见做法是在 application 里找路由配置文件加一条规则。// 路由配置示例把 about 映射到单页控制器 Route::get(about, index/Page/about);逻辑说明这条规则的意思是访问/about时交给 index 模块的 Page 控制器的 about 方法处理。参数说明不同框架路由写法不同有的用数组配置有的用注解得看源码实际用的路由组件。改完路由记得清缓存否则新规则不生效。4. 避坑与排查那些装完才发现的坑4.1 安装页空白或 500 错误现象访问 install 目录页面全白或者直接 500日志里一堆看不懂的报错。原因九成是 PHP 版本不匹配或扩展缺失。v3.5 这个年代的代码在 PHP 7.4 以上跑很多老函数被废弃或移除比如mysql_*系列、each()、create_function()一调用就致命错误。另一个常见原因是短标签?没开源码里用了短标签但 php.ini 里short_open_tag Off。解决先把 PHP 版本降到 7.2 或 5.6 试能跑起来再考虑逐步升级。短标签问题就在 php.ini 里把short_open_tag改成 On或者把源码里的?批量替换成?php。改之前备份别直接在生产环境动手。4.2 后台登录后跳回登录页现象账号密码明明对点登录后闪一下又回到登录页或者提示“请先登录”。原因session 写入失败或 cookie 域配置不对。常见于 Linux 下 runtime 目录没写权限session 文件存不进去或者站点配了 CDN、反向代理cookie 的 domain 和实际访问域名对不上。解决先确认 runtime 目录可写再看 php.ini 里session.save_path指向的目录是否存在且可写。如果是代理环境检查配置文件里 cookie domain 设置把它改成空或实际域名。还有一个隐蔽原因服务器时间不对session 过期时间计算异常date命令看一眼系统时间。4.3 上传图片失败或缩略图不显示现象后台上传图片提示成功但前台不显示或者缩略图是裂图。原因gd 扩展没装或版本不对导致缩略图生成失败uploads 目录权限不足文件没真正写进去伪静态规则把 uploads 下的静态资源也重写了请求被转到 index.php。解决php -m | grep gd确认扩展在。uploads 目录给 777 写权限。Nginx 配置里加一条location ^~ /uploads/ { }让上传目录直接走静态文件不参与 rewrite。改完重载配置再传一张图测试。4.4 修改模板后前台没变化现象明明改了模板文件刷新前台还是老样子。原因模板编译缓存没清。这类 CMS 大多会把模板编译成 PHP 文件存到 runtime 或 cache 目录改源模板不会自动触发重新编译得手动清缓存。解决后台一般有“清除缓存”按钮点一下。没有的话就手动删 runtime 目录下的缓存文件夹注意别把整个 runtime 删了有的系统在那里存了安装锁文件。删完刷新前台新模板就生效了。4.5 数据库导入报错或乱码现象迁移站点时导入 SQL 文件报错中断或者导入成功但中文全是问号。原因字符集不匹配。导出时是 utf8导入时连接用的是 latin1或者 SQL 文件里建表语句写死了 charset 但数据库默认不是。解决导入前先建库并指定CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci。导入命令加--default-character-setutf8mb4。如果已经乱码只能重新导乱码后的数据没法直接转回来。# 正确的导入方式指定字符集 mysql -u root -p --default-character-setutf8mb4 xyhcms_db backup.sql逻辑说明--default-character-set告诉客户端用 utf8mb4 解析 SQL 文件内容避免中文被按 latin1 解读。参数xyhcms_db是目标库名backup.sql是备份文件。导入前确认备份文件本身编码正确用file backup.sql看一眼。5. 二次开发与安全加固让这套老系统多跑几年5.1 安全加固的四个必做项老 CMS 最大的问题不是功能不够是安全补丁停更。v3.5 这个版本放到今天默认配置下有几处是必须手动处理的。第一后台入口改名。把 admin.php 改成只有自己知道的名字比如manage_随机串.php同时改掉后台目录名。第二删掉 install 目录或者至少加 IP 白名单限制访问。第三数据库账号最小权限只给当前库的增删改查别用 root。第四关闭错误显示生产环境display_errors Off避免报错信息泄露路径和表结构。// 在入口文件顶部加一行屏蔽错误显示只记日志 ini_set(display_errors, Off); ini_set(log_errors, On);逻辑说明这两行让 PHP 不在页面上输出错误但把错误写进日志方便排查又不暴露信息。参数说明日志路径在 php.ini 的error_log里配没配的话默认写到 Web 服务器日志里。改完记得重启 PHP 服务。5.2 加一个简单的访问频率限制如果站点对外开放后台登录页和搜索页容易被扫。加一层简单的频率限制不用上复杂组件用文件计数就能挡掉大部分脚本小子。// 简易频率限制放在公共入口或控制器基类里 $ip $_SERVER[REMOTE_ADDR]; $key rate_ . md5($ip); $file sys_get_temp_dir() . / . $key; $count (int)file_get_contents($file); if ($count 30) { exit(请求过于频繁); } file_put_contents($file, $count 1, LOCK_EX);逻辑说明用 IP 的哈希做文件名存在临时目录每次请求读计数加一。参数说明30是阈值按实际调整sys_get_temp_dir()是系统临时目录Linux 下一般是 /tmp。这个方案不精确重启就清零但挡脚本够用。要更准就上 Redis但那就不是这套轻量 CMS 的初衷了。5.3 数据备份的自动化习惯老系统最怕的是数据库悄悄坏掉等发现时已经晚了。我一般会给这类站点配一个每日备份脚本用 cron 跑保留最近七天。#!/bin/bash # 每日数据库备份保留七天 DATE$(date %Y%m%d) mysqldump -u db_user -ppassword --default-character-setutf8mb4 xyhcms_db /backup/db_$DATE.sql find /backup -name db_*.sql -mtime 7 -delete逻辑说明mysqldump导出当天数据文件名带日期。find命令找出七天前的备份文件删掉避免磁盘占满。参数说明-ppassword里密码紧贴-p不要有空格这是 mysqldump 的语法要求。脚本加进 crontab每天凌晨跑一次。备份文件最好再同步一份到别的机器或对象存储别和站点放同一块盘。5.4 模板继承与公共片段抽取改模板改多了会发现页头页尾到处重复改一处要动十个文件。这时候把公共部分抽出来用模板的 include 机制引入。!-- 在模板中引入公共头部 -- {include filepublic/header /} !-- 页面主体内容 -- div classmain.../div !-- 引入公共底部 -- {include filepublic/footer /}逻辑说明include标签把public/header.html的内容嵌进来改头部只改一个文件。参数说明file路径相对于模板根目录不带扩展名。注意被引入的文件里不要再带html和body标签否则页面结构会乱。抽取顺序建议先抽 header 和 footer再抽侧边栏和面包屑一步步来别一次动太多。5.5 版本升级与迁移的取舍XYHCMS v3.5 build0518 这个版本号意味着它已经是一个固定快照官方大概率不再更新。要不要升级到更高版本得看两点新版本有没有修复你正在用的功能的安全问题以及升级成本能不能接受。常见做法是先在本地克隆一份站点把新版本源码覆盖上去跑一遍数据库升级脚本看后台和前台是否正常。没问题再动线上。如果站点已经稳定运行且没有暴露在公网不升级也是一种选择但安全加固必须做。从那以后我每次拿到这类老 CMS 源码都强制走一遍“本地跑通、权限收紧、后台改名、备份脚本”这四步再考虑功能改动。希望帮到你。本文还有配套的精品资源点击获取