Below you will find pages that utilize the taxonomy term “discuz”
Posts
Discuz!X集群部署的系统方案和优化方式
多 web 部署时,面临的核心问题是 web 服务器间的数据共享和同步。就数据存储的方式而言,Discuz 数据包含两部分:一部分存储在 MySQL 数据库中(用户、帖子等文本类、结构化的数据),一部分存储在文件系统(附件、缓存文件等)。其中存储在 MySQL 中的数据可以方便地在多服务器间共享,扩展和冗余也已经有比较成熟的方案。这里我们主要讨论 Discuz 文件类型的数据,部分涉及到多台服务器的内容。
数据梳理 Discuz 文件类型的数据都存储于 DISCUZ_ROOT/data 目录,各目录主要功能如下:
目录 数据说明 data/attachment 附件类 data/log 运行日志 data/cache 配置参数类缓存文件(默认是sql,配置参数通过pre_common_syscache表缓存)、CSS缓存、部分JS缓存 data/template 模板缓存 data/threadcache 论坛页面缓存(针对游客的优化) DISCUZ_ROOT/data目录下有几个重要的文件(文件锁)
data/install.lock,安装程序锁定。如果该文件存在,DISCUZ_ROOT/install/ 中的安装程序不能执行。 data/sendmail.lock, 发送邮件锁。Discuz 默认通过类似 home.php?mod=misc&ac=sendmail&rand=1379315574 这个隐藏页面调用,由用户的浏览行为触发邮件发送流程(浏览器侧用一个300秒的 cookie 控制频率,服务器侧通过 sendmail.lock 文件的 mtime 控制频率5秒)。如果可以控制服务器,应该优化掉这个机制。 data/updatetime.lock, 某管理后台使用的锁。 data/update.lock, 系统升级锁。执行版本升级程序(如x2升级到x3)时,会生成这个文件锁。 下面这些功能会涉及到多 web 服务器间的数据共享和同步,默认 Discuz 通过 MySQL 实现。
用户session, 表 pre_common_session 管理面板session, 表 pre_common_admincp_session 系统配置项缓存, 表 pre_common_syscache NFS 我们假设部署两台 web 服务器的场景(且 web 服务器也是 php 应用服务器)。我们需要解决 data 目录共享的问题,引入 NFS 服务可以简单解决这个问题。服务器复用,此处不表。这里会有一个选择,哪些目录放置在 NFS 上,从上面的分析来看,将 data 目录放置在NFS上即可,即各 web 服务器均独立部署程序文件,将NFS挂载到 data 目录节点,缺点是需要将程序文件部署到每一台 web 服务器上,要解决程序文件更新部署的问题,优点是可以节省 web 服务器通过网络取 NFS 上的程序文件的开销。如果图方便,也可以把程序文件也放到 NFS 上,则所有文件都只有一个副本了,程序更新也很方便,缺点是会增加 web 服务器通过网络取程序文件的开销。这两者需要权衡,建议第一种。
Posts
Discuz!顶置贴、帖子列表优化建议
顶置贴的存储 表 pre_forum_thread 字段 displayorder
4 多版块顶置。Disczu!7.2引入的一个特性,操作入口在“论坛”-“版块/群组顶置” 3 3级置顶、全局顶置 2 2级置顶、分区顶置 1 1级置顶、版块顶置 0 正常 -1 回收站 -2 审核中 -3 审核忽略 -4 草稿 顶置2、3类的tid会被保存在pre_common_syscache的cname=“globalstick"记录中 顶置2 $_G['cache']['globalstick']['categories'][分区ID] 顶置3 $_G[‘cache’][‘globalstick’][‘global’][’tids’] 多版块顶置数据(4)被保存在pre_common_syscache的cname=“forumstick"记录中 $_G[‘cache’][‘forumstick’][版块ID] 帖子列表页对顶置贴的显示逻辑。 Discuz!通过下面的SQL查询检索上面3种置顶帖子数据。
第一页
SELECT * FROM pre_forum_thread WHERE `tid` IN('3','13','12','5') AND `displayorder` IN('2','3','4') ORDER BY displayorder DESC, lastpost DESC LIMIT 20 Using where; Using filesort 第二页
SELECT * FROM pre_forum_thread WHERE `tid` IN('3','13','12','5') AND `displayorder` IN('2','3','4') ORDER BY displayorder DESC, lastpost DESC LIMIT 20, 20 Using where; Using filesort 可以看到,即使第二页没有需要显示的顶置贴,但仍然会执行查询,这里可以做个小小的优化,计算一下IN()表达式中的tid的数量。 然后是排序部分,如果条件允许的话,建议通过PHP脚本来排序。是否使用这一项优化,主要受版块中顶置贴的数量影响。如果顶置贴数量较多,必须要通过分页来显示,就需要在数据库中排序后,才能确定在指定页面要显示的顶置贴是哪些。不过按通常的情况来看,版块中顶置贴的数量都还是比较少,很少会出现顶置贴翻页的情况。