这是一个正确的方法来销毁所有的会话数据在php?

nle07wnf  于 2023-05-27  发布在  PHP
关注(0)|答案(9)|浏览(155)

从www.example.com得到的php.net,但我不确定这是每个人都如何破坏所有会话的?

// Unset all Sessions
$_SESSION = array();

if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() -42000, '/');
}

    session_destroy();

代码是否会销毁所有会话??这是最常见的方式吗?你们是怎么销毁php会话的
对了,顺便说一句,那个session_name()是什么?所有会话名称?例如$_SESSION['var1']$_SESSION['var2']、…?
我不需要使用unset($_SESSION['var1']);任何更多的权利?
session_destroy()unset($_SESSION[])有什么区别?

0aydgbwb

0aydgbwb1#

首先,您应该知道什么是会话:您可以将会话视为服务器端的数据容器,它与一个随机标识符(会话ID)相关联。该会话ID需要由客户端提供,以便服务器可以将与该会话ID(从而与该会话)相关联的数据加载到$_SESSION变量中。$_SESSION变量中的所有内容也称为当前活动会话的 * 会话变量 *。
现在回答你们的问题:
代码是否会销毁所有会话??这是最常见的方式吗?你们是怎么销毁php会话的?
提供的代码只删除当前会话的会话数据。$_SESSION = array();语句将简单地重置会话变量$_SESSION,以便将来对会话变量$_SESSION的访问将失败。但会话容器本身尚未删除。这将通过调用session_destroy来完成。
参见Truly destroying a PHP Session?
对了,顺便问一下,session_name()是什么??所有会话名称?例如$_SESSION ['var 1'],$_SESSION ['var 2']...?
session_name仅用于识别cookie、URL查询或POST参数中传递的会话ID参数。PHP的默认值是PHPSESSID。但是你可以把它改成任何你想要的。
我不需要使用unset($_SESSION ['var 1']);更多的权利???
否。初始$_SESSION = array();删除所有会话数据。
使用session_destroy和unset($_SESSION[])有什么区别??
session_destroy将删除整个会话容器,而unset或重置$_SESSION变量将只删除当前运行时的会话数据。

6ju8rftf

6ju8rftf2#

这只会销毁当前用户的会话,而不会销毁所有其他用户的会话。
尝试使用session_保存_path()查找会话数据的存储位置,然后删除那里的所有文件。

9rygscc1

9rygscc13#

session_name()是传入cookie / querystring的名称。通常为PHPSESSID,但可以更改。
没有正确的方法来销毁所有会话。正如@Marius所说,您可以尝试从session_save_path()中删除会话文件,但这充其量是一种黑客行为。
或者,您可以使用session_set_save_handler()将会话保存到您有更多控制权的地方,例如数据库。

nhn9ugyo

nhn9ugyo4#

要销毁单个会话,应使用以下命令:

session_destroy();

假设你已经使用了session_start()来启动/恢复一个会话。
销毁所有会话实际上取决于您的设置以及您处理会话的方式。
对于大多数PHP安装,会话处理是通过文件完成的,所以最好的方法是找到保存所有会话的文件夹(通常从session_保存_path()中找到),并删除该文件夹下的所有文件。
不过,我认为,处理这个问题的最好方法可能是在您创建的每个会话中预先设置时间戳。这意味着您可以将该时间戳与一个设定点(您希望使所有会话无效的时间)进行比较,如果会话在该时间之前,则使其无效。这也意味着你可以做一些事情,比如为一个会话设置一个特定的超时,等等。
另一种方法可能是更改为使用数据库存储会话-您可以找到一个很好的教程here

5uzkadbs

5uzkadbs5#

我知道这是一个旧的线程...但我只是想分享:)
我发现,而不是使用临时文件夹的会议,你可以保存到一个数据库。因此,从技术上讲,会话管理是可能的。

我的密码:

(主要来自http://www.tonymarston.net/php-mysql/session-handler.html#session.handler):
mysql:

CREATE TABLE `php_session` (
`session_id` varchar(32) NOT NULL default '',
`user_id` varchar(16) default NULL,
`date_created` datetime NOT NULL default '0000-00-00 00:00:00',
`last_updated` datetime NOT NULL default '0000-00-00 00:00:00',
`session_data` longtext,
PRIMARY KEY  (`session_id`),
KEY `last_updated` (`last_updated`)
)

会话处理程序(我把它放在一个单独的文件php_session.class.php中):

<?php

class php_Session
{
    // ****************************************************************************
    // This class saves the PHP session data in a database table.
    // ****************************************************************************

    // ****************************************************************************
    // class constructor
    // ****************************************************************************
    function php_Session ()
    {

    } // php_Session


    // ****************************************************************************
    function open ($save_path, $session_name)
    // open the session.
    {
        // do nothing
        return TRUE;

    } // open

    // ****************************************************************************
    function close ()
    // close the session.
    {
        if (!empty($this->fieldarray)) {
            // perform garbage collection
            $result = $this->gc(ini_get('session.gc_maxlifetime'));
//            $result = ini_set('session.gc_maxlifetime',0);
            return $result;//$result
        } // if

        return FALSE;

    } // close

    // ****************************************************************************
    function read ($session_id)
    // read any data for this session.
    {
//        $fieldarray = $this->_dml_getData("session_id='" .addslashes($session_id) ."'");
        $fieldarray=array();
        $data= mysql_query("select * from php_session where session_id='" .addslashes($session_id) ."'")or die(mysql_error());
        while($row = mysql_fetch_array($data)) $fieldarray[]=$row;
        if (isset($fieldarray[0]['session_data'])) {
            $this->fieldarray = $fieldarray[0];
            $this->fieldarray['session_data'] = '';
            return $fieldarray[0]['session_data'];
        } else {
            return '';  // return an empty string
        } // if

    } // read

    // ****************************************************************************
    function write ($session_id, $session_data)
    // write session data to the database.
    {
        if (!empty($this->fieldarray)) {
            if ($this->fieldarray['session_id'] != $session_id) {
                // user is starting a new session with previous data
                $this->fieldarray = array();
            } // if
        } // if

        if (empty($this->fieldarray)) {
            // create new record
            $a   = $session_id;
            $b = date("Y-m-d H:i:s");
            $c = date("Y-m-d H:i:s");
            $d = addslashes($session_data);
//            $this->_dml_insertRecord($array);
            mysql_query("insert into php_session (session_id,date_created,last_updated,session_data) values ('$a','$b','$c','$d')");
        } else {
            // update existing record
            if (isset($_SESSION['login_id'])) {
                $a  = $_SESSION['login_id'];
            } // if
            $b = date("Y-m-d H:i:s");
            $c = addslashes($session_data);
//            $this->_dml_updateRecord($array, $this->fieldarray);
            mysql_query("update php_session set last_updated='$b',session_data='$c',user_id='$a' where session_id='$session_id'");
            $data= mysql_query("select * from php_session where session id='" .addslashes($session_id) ."'");
            while($row = mysql_fetch_array($data)) $fieldarray[]=$row;
            $this->fieldarray = $fieldarray[0];
        } // if

        return TRUE;

    } // write

    // ****************************************************************************
    function destroy ($session_id)
    // destroy the specified session.
    {
        $fieldarray['session_id'] = $session_id;
        mysql_query("delete from php_session where session_id='$session_id'");

        return TRUE;

    } // destroy

    // ****************************************************************************
    function gc ($max_lifetime)
    // perform garbage collection.
    {
        $real_now = date('Y-m-d H:i:s');
        $dt1 = strtotime("$real_now -$max_lifetime seconds");
        $dt2 = date('Y-m-d H:i:s', $dt1);

//        $count = $this->_dml_deleteSelection("last_updated < '$dt2'");
        mysql_query("delete from php_session where last_updated < '$dt2'");
        $count = mysql_affected_rows();

        return TRUE;

    } // gc

    // ****************************************************************************
    function __destruct ()
    // ensure session data is written out before classes are destroyed
    // (see http://bugs.php.net/bug.php?id=33772 for details)
    {
        @session_write_close();

    } // __destruct

// ****************************************************************************
}
?>

对不起这里的代码太乱了。

使用
**重要提示:**在调用session_start()之前放置

require_once 'php_session.class.php';
$session_class = new php_Session;
session_set_save_handler(array(&$session_class, 'open'),
                     array(&$session_class, 'close'),
                     array(&$session_class, 'read'),
                     array(&$session_class, 'write'),
                     array(&$session_class, 'destroy'),
                     array(&$session_class, 'gc'));

然后调用session_start(),你就完成了!
由于它在mysql中,你可以通过用户id(使用$_SESSION自己设置)看到谁在线,并执行诸如注销之类的功能(这就是我使用它的目的)。

2exbekwf

2exbekwf6#

您必须删除会话记录。
如果会话由DB处理-删除行。
如果会话由FILES处理-删除文件。
在这里你可以找到完整例子:
http://mdb-blog.blogspot.co.il/2015/05/php-destroydelete-all-sessions.html

1hdlvixo

1hdlvixo7#

如果你想避免警告:
注意:session_destroy():正在尝试销毁未初始化的会话... 18号线
不要忘记在代码的开头添加session_start();。除此之外,您提供的代码按预期工作。

wlzqhblo

wlzqhblo8#

最简单的方法不是一次删除所有会话,而是记住您上次的登录和会话重置的时间戳。

//Start your session
session_start();

//Get your stored timestamp of reset 
//(i.e. stored in database)
$timestamp_reset = ...

//Get your stored timestamp of your session 
//(i.e. store it in session or database when you log in)
$timestamp_session = ...

//See if the login was before the reset timestamp
if ( $timestamp_reset > $timestamp_session ) {
    //Reset you session and go on
    session_unset();
}

它不会删除所有会话文件,但会阻止旧会话运行。而且您不必依赖于垃圾收集器。没有找到类似的答案,所以我不得不添加这个。祝你今天愉快
关于您的进一步问题:
你的代码只会破坏你的单个会话,这是最常见的方式。 checkout 。
session_name会给予你一个变量的名字,php用来交换cookie,大多数时候你不需要它。在你的例子中使用的代码是一个非常旧的,请不要使用这个。
如果使用session_destroy或session_unset,则不必通过unset来取消设置每个数组项。
unset($_SESSION)将不起作用。

kyvafyod

kyvafyod9#

要从PHP中删除所有会话文件,可以使用以下函数:

<?php
/**
 * Hack to destroy all PHP session files
 *
 * @param string         $prefixSessionFile Prefix of the session filename
 * @param int|null|false $sessionIdLength   Expected Length of the session ID in the session filename. null: Determine automatically. false: do not check
 *
 * @return int Removed sessions
 * @throws Exception
 */
function destroyAllPhpSessionFiles($prefixSessionFile = 'sess_', $sessionIdLength = 26)
{
    if (session_status() === PHP_SESSION_DISABLED) {
        throw new Exception('Session handling is disabled');
    }
    if ($sessionIdLength === null) {
        if (session_status() !== PHP_SESSION_ACTIVE) {
            session_start();
        }
        $sessionIdLength = strlen(session_id());
    }
    // Allow to remove current session
    session_abort();

    // Get session dir
    if (!$sessionDir = session_save_path()) {
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // Windows
            $sessionDir = sys_get_temp_dir();
            // If this script is called from a user (example in cmd), but your server uses the system environment variable (system-wide temp dir):
            //$sessionDir = system('echo %windir%') . DIRECTORY_SEPARATOR . 'Temp';
        } elseif (is_dir('/var/lib/php5')) {
            // Ubuntu or Debian
            $sessionDir = '/var/lib/php5';
        } elseif (is_dir('/var/lib/php/session')) {
            // RHEL or CentOS
            $sessionDir = '/var/lib/php/session';
        }
        if (!$sessionDir || !is_dir($sessionDir)) {
            $sessionDir = sys_get_temp_dir();
        }
    }

    // Drop session files
    $files           = scandir($sessionDir);
    $sessionsDeleted = 0;
    $prefixLength    = strlen($prefixSessionFile);
    $filenameLength  = $prefixLength + $sessionIdLength;
    foreach ($files AS $file) {
        if (substr($file, 0, $prefixLength) != $prefixSessionFile) {
            // Prefix does not fit
            continue;
        }
        if ($sessionIdLength && strlen($file) != $filenameLength) {
            // Filename length does not fit
            continue;
        }
        $path = $sessionDir . DIRECTORY_SEPARATOR . $file;
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // Windows
            exec('DEL ' . $path);
        } else {
            // Linux / Unix
            shell_exec('rm -f ' . $path);
        }
        if (is_file($path)) {
            throw new Exception('Could not delete session file ' . $path);
        }
        $sessionsDeleted++;
    }
    return $sessionsDeleted;
}

相关问题