2

我有一个简单的下载页面,它接收文件 URL、下载计数器 .TXT 文件 url 以及下载后的重定向链接。这都是通过 PHP 参数发送的。问题是,有人一直在向下载者发送垃圾邮件并弄乱计数。我想在下载计数器上设置一个上限,以便每个可下载项目的每个地址仅计算 3 次点击。

我需要能够仅使用 PHP 而不使用 MySQL 数据库来执行此操作。我确实有这个理由,我的数据库服务器是垃圾且不可靠,我不能让计数器停机。

这是我当前的下载器 PHP 文件。进一步的信息,这个 PHP 文件位于它自己的文件夹中,每个下载计数 TXT 文件都有/counter一个/counter/data目录。这些文件只存储一个整数值。

<?
    //Retrieve downloadable file URL
    $c_url = urldecode($_GET['url']);

    //retrieve redirect page URL
    $c_page = urldecode($_GET['page']);

    //Retrieve download counter TXT URL
    $c_file = "../" . $_GET['file'];
?>

<!-- Set up simple styles -->
<head>
    <style type="text/css">
        body{
            background: url("../images/background.png");
            color: #ffffff;
        }
    </style>
</head>

<!-- Creates download file URL in hidden iFrame -->
<iframe src="<?echo $c_url;?>" id="hiddenFrm" style="display:none;" frameborder="0"></iframe>

<body>
<center>
    <h1>Your download is starting</h1><br>
    <p>You should be redirected momentarily...<br>

    <?
    <br><br>

    if (file_exists($c_file))
    {
        //Add one value to the counter file
        file_put_contents($c_file, ((int) file_get_contents($c_file)) + 1);

        //Set an automatic redirect for the page (Return home)
        ?>
        <meta http-equiv="refresh" content="0;url=<?echo $c_page;?>" />
        <?

        //Display information about the download, and alternate exits to the page
        if ($c_url != "") 
        {?>
            <b><a href="<?echo $c_url?>">Click here</a> if the download did not start.<br><br>
            <a href="<?echo $c_page?>">Click here</a> if this page does not close after your download.</b></p>
        <?} 
        else 
        {
        ?>
            <b><a href="<?echo $c_page?>">Click here</a> if you are not redirected automatically</b></p>
        <?
        }
    }
    else
    {
        //In case our counter file is improperly specified
        echo "<br><br><br>Error, the counter file was not found!";
    }
    ?>
    </center>
</body>

我的问题简化了:如何存储下载每个产品的人的 IP 地址,并防止下载计数器仅使用 PHP 而没有数据库从该地址计算超过 3 次下载?

非常感谢您的帮助。

编辑: 正如我上面所说,我不能使用数据库。另外,我对两种解决方案感兴趣,但不确定如何使它们工作(我正在寻找代码示例),一种是 cookie,另一种是充当数据库的文本文件。

4

3 回答 3

2

根本不使用任何数据库将非常困难。如果您根本不能使用 MySQL,我会感到惊讶,但也许像 SQLite 这样更简单的东西可能会起作用。除此之外,我还能想到两种解决方案:文件系统和 cookie。

cookie 的问题在于它们是暂时的,如果您有机器人向您发送垃圾邮件,它们可能无论如何都会拒绝 cookie 设置。

你可以做的是维护一个文件

IP    download-count    last-download-time

如果文件足够小,您可以将其加载到内存中file并搜索 IP 地址preg_grep并以这种方式更新计数。

请注意,IP 地址可能不是最好的选择,因为一些有效和无效的用户可能共享移动路由器,并且 IP 地址可能会通过使用代理等方式进行欺骗。最好的选择是某种用户身份验证系统,但是没有数据库会非常困难

于 2013-04-07T16:31:38.860 回答
1

我会使用内存缓存。你可以在这里查看 PHP 的文档:http: //php.net/manual/en/book.memcache.php

您可以使用 IP 地址字符串作为密钥,然后在每个下载请求中,您将尝试执行 $memcache->get($key)。如果那不存在,您将执行 $memcache->set($key, $downloadCount)。如果密钥确实存在,您将增加 downloadCount。

于 2013-04-07T16:45:09.127 回答
0

数据必须存储在某个地方,因为 PHP 总是“从头开始”。代表数据库的文本文件怎么样?

于 2013-04-07T16:28:43.973 回答