织梦默认统计的“不真实”之处
织梦默认的下载次数统计(通过 click 字段)是在用户点击下载链接的那一刻就增加一次计数。
这导致了几个不真实的情况:
- 机器人/爬虫刷量:任何爬虫程序、搜索引擎蜘蛛只要访问你的下载链接,就会触发一次点击,导致数据虚高。
- 用户误点:用户可能只是想看看链接,或者不小心点错了,也会被算作一次有效下载。
- 未完成下载:用户点击了下载链接,但由于网络问题、取消下载等原因,实际上并没有完成文件下载,但计数已经增加了。
织梦默认的 click 字段更像是一个“链接点击次数”,而不是“文件真实下载次数”。
解决方案:实现“真实下载次数”统计
要实现真实下载次数,最准确、最可靠的方法是在用户真正开始下载文件的那一刻才增加计数,这通常通过修改PHP下载处理文件来实现。
以下是两种主流的实现方法,推荐使用方法二,因为它更稳定且不修改核心文件。
修改 dede/downlinks.php 文件(传统方法)
这个文件是织梦处理下载请求的核心文件,我们可以修改它,让它在文件流开始传输之前更新计数。
操作步骤:
-
备份文件:请务必备份你的
/include/downlinks.php文件。 -
打开文件:用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开
/include/downlinks.php。 -
找到关键代码:找到大约在第34行左右的代码,通常是:
if($link == '') ShowMsg('请求地址不存在!', '-1'); $link = str_replace('../', '', $link); $link = str_replace('..', '', $link); $link = eregi_replace("(://){1,}", "\\1", $link); $row = $dsql->GetOne("Select * From `#@__downloads` where url='$link' "); -
修改代码:在上述代码块之后,在文件流传输之前,加入更新计数的SQL语句,修改后的代码类似这样:
// ... 原来的代码 ... if($link == '') ShowMsg('请求地址不存在!', '-1'); $link = str_replace('../', '', $link); $link = str_replace('..', '', $link); $link = eregi_replace("(://){1,}", "\\1", $link); $row = $dsql->GetOne("Select * From `#@__downloads` where url='$link' "); // ====== 在这里添加真实下载统计代码 ====== if(is_array($row)) { // 更新下载次数 $dsql->ExecuteNoneQuery("Update `#@__downloads` set clicks=clicks+1 where id='".$row['id']."'"); } // ====================================== // 继续原来的文件流传输代码 $mime = GetType($link); $fileend = substr($link, strrpos($link, '.') + 1); $type = array ( 'php' => 'application/x-httpd-php', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'doc' => 'application/msword', 'xls' => 'application/vnd.ms-excel', 'pdf' => 'application/pdf', 'zip' => 'application/zip', 'rar' => 'application/rar', 'exe' => 'application/octet-stream', 'txt' => 'text/plain' ); if(isset($type[$fileend])) { $mime = $type[$fileend]; } header('Content-Type: '.$mime); header('Content-Disposition: attachment; filename="'.basename($link).'"'); header('Content-Description: PHP Generated Data'); header("Content-Length: " . filesize($link)); readfile($link); exit();
原理说明:
这段修改的核心是,在程序确认文件存在,并即将通过 readfile() 将文件内容发送给用户浏览器之前,先执行一次数据库更新操作,将 clicks 字段加1,这样,只有当用户浏览器开始接收文件数据时,计数才会增加,从而实现了“真实下载”的统计。
使用织梦的“自定义页面”功能(推荐方法)
这种方法更安全,因为它不修改织梦的核心程序文件,升级网站时不会被覆盖。
操作步骤:
-
创建下载处理页面:
- 登录织梦后台,在“核心” -> “频道模型” -> “自定义管理”中,点击“增加自定义页面”。
- 页面名称:填写
real_down或你喜欢的名字。 - 页面文件名:填写
real_down.php。 - 留空即可。
- 提交并生成页面。
-
修改
real_down.php文件:- 通过FTP或主机文件管理器,找到
/plus/目录下的real_down.php文件。 - 用代码编辑器打开它,清空原有内容,然后粘贴以下代码:
<?php /** * 织梦CMS真实下载次数统计处理页面 * 此方法不修改核心文件,更安全 */ require_once(dirname(__FILE__)."/../include/config_base.php"); require_once(DEDEINC."/arc.downloads.class.php"); // 获取传递过来的文件ID $id = isset($id) && is_numeric($id) ? intval($id) : 0; if($id <= 0) { ShowMsg('请求参数错误!', '-1'); exit(); } // 实例化下载类 $dlink = new Downloads($id); // 更新下载次数 $dlink->Down(); // 获取真实的下载地址 $url = $dlink->downloads; // 判断文件是否存在 if(!file_exists($url)) { ShowMsg('文件不存在或已被删除!', '-1'); exit(); } // 获取文件扩展名 $fileend = substr($url, strrpos($url, '.') + 1); $type = array ( 'php' => 'application/x-httpd-php', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'doc' => 'application/msword', 'xls' => 'application/vnd.ms-excel', 'pdf' => 'application/pdf', 'zip' => 'application/zip', 'rar' => 'application/rar', 'exe' => 'application/octet-stream', 'txt' => 'text/plain' ); // 设置正确的MIME类型 if(isset($type[$fileend])) { header('Content-Type: '.$type[$fileend]); } else { header('Content-Type: application/octet-stream'); } // 设置下载文件名 header('Content-Disposition: attachment; filename="'.basename($url).'"'); header('Content-Description: PHP Generated Data'); header("Content-Length: " . filesize($url)); // 输出文件内容 readfile($url); exit(); ?> - 通过FTP或主机文件管理器,找到
-
修改下载模板:
- 打开你正在使用的下载列表模板(通常是
/templets/你的模板/softlist.htm或文章内容页模板)。 - 找到下载链接的代码,织梦默认的标签是
{dede:field name='softlinks'/}或[field:softlink/]。 - 将其修改为调用我们刚创建的
real_down.php页面,并传递文档ID。
修改前:
<a href="{dede:field name='softlinks'/}" target="_blank">点击下载</a>修改后:
<a href="/plus/real_down.php?id={dede:field name='id'/}" target="_blank">点击下载</a>- 请确保
/plus/real_down.php的路径正确。
- 打开你正在使用的下载列表模板(通常是
原理说明:
这种方法创建了一个专门的下载处理入口 real_down.php,所有下载请求都先经过这个页面,这个页面首先调用织梦自带的 Downloads 类,该类的 Down() 方法会自动更新数据库中的下载次数,它再处理文件的传输,这完美地利用了织梦自身的机制,实现了真实下载统计,且代码与核心分离。
总结与对比
| 特性 | 方法一 (修改 downlinks.php) | 方法二 (自定义页面) |
|---|---|---|
| 安全性 | 较低,修改了核心文件,升级网站时有被覆盖的风险。 | 高,不修改核心文件,升级无忧。 |
| 稳定性 | 一般,如果织梦官方更新了此文件,你的修改会失效。 | 高,完全独立于核心文件。 |
| 实现复杂度 | 简单,直接修改一个文件即可。 | 稍复杂,需要创建自定义页面并修改模板。 |
| 推荐度 | 不推荐,仅适用于不升级的老旧网站。 | 强烈推荐,是当前最规范、最安全的解决方案。 |
最终建议:
为了网站的长期稳定维护,请优先选择方法二(自定义页面),虽然步骤稍多,但它一劳永逸,避免了未来升级带来的麻烦,是专业开发者推荐的最佳实践。
