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

how unset session when close the web page in php

本文关键字:取消 会话 设置 何取消 PHP 网页      更新时间:2023-09-26

当我通过单击 [x] 关闭页面时,如何取消设置 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"]);
}

在页面加载的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";
}
?>
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) 模式 php.ini session.cookie_lifetime 到 0(会话在浏览器关闭时结束 - 与上述相同,但更全局)

4)每30秒有一个ajax回调,如果你在一分钟后没有收到回调,假设浏览器已经关闭,然后杀死会话。(需要相当多的处理!