[转]DX1.5关于帖子查看数及附件下载数延迟更新的详解
2012-04-29 13:49
169 查看
************************************************* ** 代码讲解基于版本:Discuz! X 1.5 GBK Release 20110121 ** ************************************************* 帖子查看数及附件下载数延迟更新,可明显降低访问量很大的站点的服务器(主要针对 MySQL 的压力)负担,建议开启本功能。但对其中的程序流程和功能细节,可能有很多站长不是很清晰,在这里码点文字给大家串一串,希望在这个地方以后遇到问题,可以为大家提供一些思路。 一、如何开启延迟更新 涉及的文件:source\admincp\admincp_setting.php 搜索关键字:delayviewcount 开启延迟更新在论坛后台的“全局 » 优化设置 » 服务器优化”中,按照需要在“点击数延迟更新”下勾选复选框就OK了,这个地方很简单。 在“点击数延迟更新”下有“主题浏览量”和“附件下载量”两项设置,但他们却是保存在同一个设置项目 delayviewcount 中的,所以这里从程序上做了点小处理。提交过来的两个选项,如果勾选其值即为1,不勾选其值即为0,将其拼接成二进制的字符,然后再将其转换为十进制后存到数据库中的。即为: 附件下载量关闭值为0,主题浏览量关闭值为0,拼接为二进制的数字为00,转换为十进制为0; 附件下载量关闭值为0,主题浏览量开启值为1,拼接为二进制的数字为01,转换为十进制为1; 附件下载量开启值为1,主题浏览量关闭值为0,拼接为二进制的数字为10,转换为十进制为2; 附件下载量开启值为1,主题浏览量开启值为1,拼接为二进制的数字为11,转换为十进制为3。 所以在数据表(pre_common_setting 表)中存储的值(skey = 'delayviewcount' 时,svalue 对应的值)即为0、1、2、3。 二、主题浏览量延迟更新的实际使用 涉及的文件:source\module\forum\forum_viewthread.php 搜索关键字:function viewthread_updateviews 涉及的文件:source\function\function_misc.php 搜索关键字:function updateviews 主题的浏览量即为查看数,在浏览一个主题时(访问 forum_viewthread.php 文件),则会给该主题的查看数加1,这个动作在 viewthread_updateviews 这个函数(forum_viewthread.php 文件的 695 行附近)中进行。如果没有开启延迟更新,则会直接在 pre_forum_thread 表的对应的主题记录中的 views 字段上加1。根据后台设置中的值($_G['setting']['delayviewcount'] 的值,请参照上述对应值的开启关系)可以看出,值为1和3时均代表开启了主题浏览量的延迟更新,此时会进入延迟更新的流程。 延迟更新点击数会在 data/cache 目录下产生以 forum_threadviews 开头的 .log 文件,所以服务器上必须赋予这个目录可读可写的权限。每一个需要增加点击数的主题的 tid 都会写入这个文件中,并独自占一行,此时不会对 pre_forum_thread 表有任何写操作,达到延迟更新的目的。 当任意一个用户访问到主题浏览页(访问 forum_viewthread.php 文件)时,系统的时间戳的值的末尾两位为 00 时,便会触发将缓存的点击数一次性更新进数据库中。前面所讲的系统的时间戳如果大家不理解不要紧,就理解为 00 等于 100 秒,即每隔 100 秒就会触发一次更新,此处的 100 秒代表一个整点秒数的时间点,而不是时间间隔为 100 秒,所以触发更新必须在某一个时间点发生,而不是过 100 秒必定会发生一次更新。 举例:当前是午夜 00:00:00,100 秒之后是 00:01:40,则只有在 00:01:40 这一个时间点上有用户访问主题页面才会触发更新,如果刚巧没人访问则不会触发更新,便要等到下一个 100 秒后的时间点 00:03:20 的到来。 更新触发后,会调用 function_misc.php 文件中的 updateviews 函数(function_misc.php 文件的 299 行附近)执行批量的更新,将所有主题缓存的点击数一次性更新到数据库中。此过程需要 rename 函数的支持,所以要确保 data/cache 目录可读可写,并且在 PHP 的配置文件 php.ini 中不能禁止此函数,即 disable_functions 后面没有 rename 字样。 三、附件下载量延迟更新的实际使用 涉及的文件:source\module\forum\forum_attachment.php 搜索关键字:updateviews 涉及的文件:source\function\function_misc.php 搜索关键字:function updateviews 附件下载量,在下载一个附件时(访问 forum_attachment.php 文件),则会给该附件的下载数加1,这个动作在 updateviews 这个函数执行的周围(forum_attachment.php 文件的 178 行附近)进行。如果没有开启延迟更新,则会直接在 pre_forum_attachment 表的对应的附件记录中的 downloads 字段上加1。根据后台设置中的值($_G['setting']['delayviewcount'] 的值,请参照上述对应值的开启关系)可以看出,值为2和3时均代表开启了附件下载量的延迟更新,此时会进入延迟更新的流程。 延迟更新点击数会在 data/cache 目录下产生以 forum_attachviews 开头的 .log 文件,所以服务器上必须赋予这个目录可读可写的权限。每一个需要增加下载量的附件的 aid 都会写入这个文件中,并独自占一行,此时不会对 pre_forum_attachment 表有任何写操作,达到延迟更新的目的。 当任意一个用户下载附件(访问 forum_attachment.php 文件)时,系统的时间戳的值的末尾一位为 0 时,便会触发将缓存的下载量一次性更新进数据库中。前面所讲的系统的时间戳如果大家不理解不要紧,就理解为 0 等于 10 秒,即每隔 10 秒就会触发一次更新,此处的 10 秒代表一个整点秒数的时间点,而不是时间间隔为 10 秒,所以触发更新必须在某一个时间点发生,而不是过 10 秒必定会发生一次更新。 举例:当前是午夜 00:00:00,10 秒之后是 00:00:10,则只有在 00:00:10 这一个时间点上有用户去下载一个附件才会触发更新,如果刚巧没人下载则不会触发更新,便要等到下一个 10 秒后的时间点 00:00:20 的到来。 更新触发后,会调用 function_misc.php 文件中的 updateviews 函数(function_misc.php 文件的 299 行附近)执行批量的更新,将所有主题缓存的点击数一次性更新到数据库中。此过程需要 rename 函数的支持,所以要确保 data/cache 目录可读可写,并且在 PHP 的配置文件 php.ini 中不能禁止此函数,即 disable_functions 后面没有 rename 字样。 |
相关文章推荐
- Discuz! X2 关于帖子查看数及附件下载数延迟更新的详解
- WordPress foxpay 收费下载资源插件 vip会员功能/收费下载/收费查看/联盟推广+前端用户中心 支付宝/财付通/贝宝/网银[更新至v4.5]
- Android关于FTP文件上传和下载功能详解
- 关于 JS 的脚本执行及 SetTimeOut延迟时间为0的详解
- 关于MongoDB索引管理-索引的创建、查看、删除操作详解
- 关于Visual Assist X(VC助手)几个最新版本的比较与破解下载——更新到10.7.1903.0
- Smark.Data 1.5更新详解
- 关于下载Android源码是无法获取repo和更新Android SDK的错误
- 解决Android SDK下载和更新失败的方法详解
- 关于Visual Assist X(VC助手)几个最新版本的比较与破解下载——更新到10.6.1854
- 修改nginx配置文件解决dx2.5下载附件停止不动的问题
- DownloadManager使用详解以及APK下载更新
- 详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
- Discuz3.2怎么设置游客也能查看帖子附件?
- vip会员+推广提成+收费下载/查看内容+前端个人中心 银联/支付宝/贝宝paypal WordPress中文插件[更新至v3.0.2]
- unity3d 关于断点下载和整个下载(用于更新)
- 详解python实现读取邮件数据并下载附件的实例
- Android关于后台下载前台通知更新进度条的问题
- unity3d 关于断点下载和整个下载(用于更新)