织梦迅雷下载真实次数如何统计?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 织梦建站 正文

织梦默认统计的“不真实”之处

织梦默认的下载次数统计(通过 click 字段)是在用户点击下载链接的那一刻就增加一次计数。

这导致了几个不真实的情况:

  1. 机器人/爬虫刷量:任何爬虫程序、搜索引擎蜘蛛只要访问你的下载链接,就会触发一次点击,导致数据虚高。
  2. 用户误点:用户可能只是想看看链接,或者不小心点错了,也会被算作一次有效下载。
  3. 未完成下载:用户点击了下载链接,但由于网络问题、取消下载等原因,实际上并没有完成文件下载,但计数已经增加了。

织梦默认的 click 字段更像是一个“链接点击次数”,而不是“文件真实下载次数”。


解决方案:实现“真实下载次数”统计

要实现真实下载次数,最准确、最可靠的方法是在用户真正开始下载文件的那一刻才增加计数,这通常通过修改PHP下载处理文件来实现。

以下是两种主流的实现方法,推荐使用方法二,因为它更稳定且不修改核心文件。

修改 dede/downlinks.php 文件(传统方法)

这个文件是织梦处理下载请求的核心文件,我们可以修改它,让它在文件流开始传输之前更新计数。

操作步骤:

  1. 备份文件:请务必备份你的 /include/downlinks.php 文件。

  2. 打开文件:用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开 /include/downlinks.php

  3. 找到关键代码:找到大约在第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' ");
  4. 修改代码:在上述代码块之后,在文件流传输之前,加入更新计数的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,这样,只有当用户浏览器开始接收文件数据时,计数才会增加,从而实现了“真实下载”的统计。


使用织梦的“自定义页面”功能(推荐方法)

这种方法更安全,因为它不修改织梦的核心程序文件,升级网站时不会被覆盖。

操作步骤:

  1. 创建下载处理页面

    • 登录织梦后台,在“核心” -> “频道模型” -> “自定义管理”中,点击“增加自定义页面”。
    • 页面名称:填写 real_down 或你喜欢的名字。
    • 页面文件名:填写 real_down.php
    • 留空即可。
    • 提交并生成页面。
  2. 修改 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();
    ?>
  3. 修改下载模板

    • 打开你正在使用的下载列表模板(通常是 /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) 方法二 (自定义页面)
安全性 较低,修改了核心文件,升级网站时有被覆盖的风险。 ,不修改核心文件,升级无忧。
稳定性 一般,如果织梦官方更新了此文件,你的修改会失效。 ,完全独立于核心文件。
实现复杂度 简单,直接修改一个文件即可。 稍复杂,需要创建自定义页面并修改模板。
推荐度 不推荐,仅适用于不升级的老旧网站。 强烈推荐,是当前最规范、最安全的解决方案。

最终建议:

为了网站的长期稳定维护,请优先选择方法二(自定义页面),虽然步骤稍多,但它一劳永逸,避免了未来升级带来的麻烦,是专业开发者推荐的最佳实践。

-- 展开阅读全文 --
头像
dede 获取当前时间
« 上一篇 03-26
c语言求两个数的最大公约数
下一篇 » 03-26

相关文章

取消
微信二维码
支付宝二维码

目录[+]