在php中关闭网页时如何取消设置会话

时间:2012-05-28 11:46:50

标签: php javascript session browser

单击[x](不是onunload)关闭页面时,如何取消设置SESSION。我想在打开页面时和关闭时插入,但我不想在刷新时插入。

if (!isset($_SESSION["visits"]))
    $_SESSION["visits"] = 0;
    $_SESSION["visits"] = $_SESSION["visits"] + 1;
if ($_SESSION["visits"] > 1){echo "You hit the refresh button!";}
else{
    mysql_query(
        "INSERT INTO najd_visit( visit_userId, visit_staticId, visit_page,
            visit_enterTime)VALUES ('$userId', '$Sid', '$title', '$date') ");
    echo "This is my site";
    //unset($_SESSION["visits"]);
}

2 个答案:

答案 0 :(得分:1)

在页面加载的JS事件和离开(onbeforeunload事件)之前对你的php进行ajax调用。

更好地依赖于像jQuery这样的JS库,因为对两个事件监听器的直接JS跨浏览器实现对代码来说非常棘手。

更新。感谢@piers评论,我发现我的解决方案并不完整,因为它会在页面刷新时计算。如果我正确理解了任务,那么目标是计算页面打开和离开,而不是计算刷新事件。

所以,也许,没有必要在页面关闭时取消设置会话 - 让它在服务器超时时消失?

您可以使用session_id确定页面/会话对是否唯一。例如,您可以在会话中保留访问过的网页网址,以检查您是否已计入以下内容:

<?php
$uri = $_SERVER['REQUEST_URI'];
if( is_set( $_SESSION['seen']) {
    if( !in_array( $uri, $_SESSION['seen'])){
        countup( $uri);
    } else {
        // already counted that page
    }
} else { // session doesn't have the seen array yet
    countup( $uri);
}

function countup( $uri) {
    $_SESSION['seen'][] = $uri;
    mysql_query( "
        INSERT INTO najd_visit 
        ( visit_userId, visit_staticId, visit_page, visit_enterTime)
        VALUES ('$userId', '$Sid', '$title', '$date')
    ");
    echo "This is my site";
}
?>

答案 1 :(得分:0)

session_set_cookie_params(0);
session_start()

手动:http://www.php.net/manual/en/function.session-set-cookie-params.php


澄清:

您想在用户不再访问您的网站时终止会话?但如果他们留在你的网站上(后退按钮,转发等),那么你想保持会话。

要回答直接问题 - 您无法跟踪用户何时关闭浏览器 - 即当他们按照评论中的要求点击“x”时。

您无法使用“onunload”,因为当用户点击您网站上的网页时会发生这种情况。

所以你有四个选择:

1)使用cookie手动控制会话,并在浏览器会话结束时将cookie设置为过期。

2)Mofify session_set_cookie_params(0)http://www.php.net/manual/en/function.session-set-cookie-params.php因此会话在浏览器关闭时结束。

3)modity php.ini session.cookie_lifetime为0(当浏览器关闭时会话结束 - 与上面相同但更全局化)

4)每30秒钟回拨一次ajax,如果一分钟后没有收到回叫,则假设浏览器已关闭,然后终止会话。 (需要大量处理!)