当我尝试计算IP命中数时,为什么我的会话不起作用


Why is my session not working when I try to count IP hits?

我正试图在PHP中创建一个计数器,该计数器将计算IP在一个设定的时间段内可以访问页面的次数,当它在该时间段内达到下载计数器时,它会重新定向。我看到推荐的方法是在参考了几个问答之后,在一个环节中这样做;As:

  • PHP函数每次将变量递增1
  • 如何不通过刷新增加页面/帖子浏览次数
  • php在提交时用1递增变量值

我还看了:

  • 如何计算我的网站的唯一访问者
  • 在php页面中添加计数器以统计唯一访问者

我对cookie和会话没有太多经验,所以我相信这就是我代码的错误所在。如果你对比我现在做的更好的实施有任何建议,请提供建议。

代码:

$jsonFile       = 'foobar.json';
$theJSON        = file_get_contents($jsonFile);  
$jsonArray      = json_decode($theJSON, true);
$theIP          = "123.123.123"; // $_SERVER['REMOTE_ADDR']
$thisTime       = date("H:i");
$addMin         = 1; // set value for testing purposes
$addHour        = 0; // set value for testing purposes
$downloadHits   = 5; // set value for testing purposes
$timeLater      = date("H:i", strtotime($thisTime)+(($addMin*60)+($addHour*60*60)));

if (!empty($theIP) && !empty($jsonArray)) {
    foreach ($jsonArray as $value) {
        if (in_array($theIP, $value, true)) {
            echo "yes"; // header('Location: https://www.url/darthvader.com');
            exit();
        } else {
            if ($thisTime <= $timeLater) { // where my issue starts
                echo $timeLater; // for testing
                session_start();
                $counter = $_SESSION['promo_number'];
                $counter++;
                if ($counter == $downloadHits && file_exists($jsonFile)) {
                    $currentData = file_get_contents($jsonFile);  
                    $currentArray = json_decode($currentData, true); 
                    $theStuff = array(  
                        'ip'    => "123.123.123", // $_SERVER['REMOTE_ADDR']  
                        'date'  => date("H:i"),
                        'time'  => date("m.d.y")
                    );
                    $currentData[] = $theStuff;  
                    $finishData = json_encode($currentData);
                } else {
                    echo 'bar'; // for testing
                    session_unset();
                    session_destroy();
                }
            }
        }
    }
} else {
    echo '<span style="color:red; font-weight:bold;">empty file</span>';
}

我想做的是计算IP在设定时间内访问帖子的次数,如果达到该次数,则重定向IP。我知道IP可能会被欺骗,我并不担心,而且我现在更喜欢而不是使用数据库。那么,我如何正确地设置一个会话来计算点击量,如果IP点击了帖子,它会重定向IP?


编辑:

在阅读了一些内容并得到了评论和答案的帮助后,我进行了一次编辑,希望能解释我想要做什么。在进一步研究后,我遇到了:

  • session_destroy((在PHP中经过一定时间后
  • 如何在30分钟后使PHP会话过期

这让我找到了代码:

session_start();
$jsonFile           = 'foobar.json';
$jsonArray          = json_decode(file_get_contents($jsonFile), true);
$theIP              = $_SERVER['REMOTE_ADDR'];
$addMin             = 2; // set value for testing purposes
$addHour            = 0; // set value for testing purposes
$targetedHits       = 1; // set value for testing purposes
$timeLater          = time() + ($addMin*60) + ($addHour*60*60);
$_SESSION['expire'] = $timeLater;
if (!empty($theIP) && !empty($jsonArray)) {
    //look for the $theIP
    if (in_array($theIP,array_column($jsonArray,'ip'))) {
        echo 'IP found in json';
        exit;
    }
    // look at the time the session was set, add to counter or delete session
    if ($_SESSION['count'] = isset($_SESSION['count']) && time() < $_SESSION['expire'] ) {
        echo 'adding to count';
        $_SESSION['count'] + 1;
        // limit reached. Add IP to blacklist
        if ($_SESSION['count'] > $targetedHits) {
            echo 'session count reached max';
            $jsonArray[]=[
                'ip'    => $theIP,
                'date'  => date("H:i"),
                'time'  => date("m.d.y")
            ];
            // save changes
            file_put_contents($jsonFile,json_encode($jsonArray));
            session_destroy();
            exit;
        }       
    } elseif (time() > $_SESSION['expire']) {
        echo 'nuking session and counter';
        session_destroy();
    } else {
        echo 'setting count to 1';
        $_SESSION['count'] = 1;
    }
}
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';

但遗憾的是,现在$_SESSION['count'] + 1;不再递增。

达斯·维德,你就快到了。你的剧本有几个问题。

  • 您从未在会话中保存计数,因此以后无法检索
  • 您在脚本中开始会话的时间较晚。这是一种糟糕的做法,因为一旦你回声更高的东西,或者忘记并尝试使用更高的$_SESSION,它就会中断
  • 您读取JSON文件并对其进行两次不必要的解码,浪费了系统内存
  • 您从不保存对JSON所做的更改
  • 您在成功下载后调用session_unset()session_destroy(),因此即使您试图正确保存计数,计数也会丢失

我的修改:

session_start();    
$jsonFile       = 'foobar.json';
$jsonArray = json_decode(file_get_contents($jsonFile), true);
$theIP          = $_SERVER['REMOTE_ADDR'];
$thisTime       = time();
$addMin         = 1; // set value for testing purposes
$addHour        = 0; // set value for testing purposes
$downloadHits   = 5; // set value for testing purposes
$timeLater      = $thisTime + ($addMin*60) + ($addHour*60*60);    
if(empty($theIP)){
    echo 'empty file';
    exit;
}
//look for the $theIP in the 'ip' column
if(in_array($theIP,array_column($jsonArray,'ip'))){
    echo 'IP found in json';
    exit;
}    
if($thisTime > $timeLater){//not sure what you want to do here
    exit;
}
//increment the count, or set it to 1 to begin
$_SESSION['count'] = isset($_SESSION['count'])? $_SESSION['count']+1 : 1;
if($_SESSION['count']>=$downloadHits){//limit reached. Add IP to blacklist
    $jsonArray[]=[
        'ip'    => $theIP,
        'date'  => date("H:i"),
        'time'  => date("m.d.y")
    ];
    //save changes
    file_put_contents($jsonFile,json_encode($jsonArray));
    exit;
}        
echo 'good to go!'; //allow the download

快乐的编码。

在session标签下花了一段时间后发现了这一点。这两个问题很有帮助:

  • 如何检查PHP会话是否为空
  • 如何正确清除php会话数据

这让我找到了代码:

session_start();
$jsonFile           = 'foobar.json';
$jsonArray          = json_decode(file_get_contents($jsonFile), true);
$theIP              = $_SERVER['REMOTE_ADDR'];
$addMin             = 1; // set value for testing purposes
$addHour            = 0; // set value for testing purposes
$targetedHits       = 5; // set value for testing purposes
$timeLater          = time() + ($addMin*60) + ($addHour*60*60);
if (empty($_SESSION['count'])) {
    $_SESSION['expire'] = $timeLater;
}
if (!empty($theIP) && !empty($jsonArray)) {
    // look for the $theIP
    if (in_array($theIP,array_column($jsonArray,'ip'))) {
        $_SESSION['count'] = 0;
        session_destroy();
        echo 'IP found in json';
        exit;
    }
    if (time() < $_SESSION['expire']) {
        echo 'below the time ';
        $_SESSION['count'] = isset($_SESSION['count'])? $_SESSION['count'] + 1 : 1;
        if ($_SESSION['count'] > $targetedHits) {
            echo 'session count reached max ';
            $jsonArray[] = [
                'ip'    => $theIP,
                'date'  => date("H:i"),
                'time'  => date("m.d.y")
            ];
            // save changes
            file_put_contents($jsonFile,json_encode($jsonArray));
            unset($_SESSION['count']);
            session_destroy();
            exit;
        }       
    } elseif (time() > $_SESSION['expire']) {
        echo 'nuking session and counter';
        $_SESSION['count'] = 0;
        unset($_SESSION['expire']);
    }   
}
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';

我希望以上内容能帮助到下一个人,因为我对会议一无所知,今晚能做到这一点真是一次冒险。