Это правильный способ уничтожить все данные сеанса в php? - PullRequest
13 голосов
/ 04 августа 2009

Получено с 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[])?

Ответы [ 9 ]

21 голосов
/ 04 августа 2009

Сначала вы должны знать, что такое сеансы: сеансы можно рассматривать как контейнер данных на стороне сервера, связанный со случайным идентификатором, идентификатором сеанса. Этот идентификатор сеанса должен быть предоставлен клиентом, чтобы сервер мог загрузить данные, связанные с этим идентификатором сеанса (и, следовательно, с этим сеансом), в переменную $_SESSION. Все в этой переменной $_SESSION также называется переменными сеанса текущего активного сеанса.

Теперь к вашим вопросам:

Разрушает ли код все сеансы ?? Это самый распространенный способ? как вы, ребята, уничтожаете php сессии ??

Предоставленный код просто удаляет данные сеанса текущего сеанса. Оператор $_SESSION = array(); просто сбрасывает переменную сеанса $_SESSION, чтобы в будущем доступ к переменной сеанса $_SESSION не удался. Но сам контейнер сессии еще не удален. Это будет сделано, позвонив по номеру session_destroy.

См. Также Действительно уничтожить сессию PHP?

О да, кстати, что это за сессия_имя () ?? Все название сессии? например, $ _SESSION ['var1'], $ _SESSION ['var2'] ...?

session_name просто используется для идентификации параметра идентификатора сеанса, переданного в файле cookie, в запросе URL или через параметр POST. Значение по умолчанию PHP PHPSESSID. Но вы можете изменить его на что угодно.

Мне не нужно использовать unset ($ _ SESSION ['var1']); больше права ???

Нет. Исходное значение $_SESSION = array(); удаляет все данные сеанса.

В чем разница между использованием session_destroy и unset ($ _ SESSION []) ??

session_destroy удалит весь контейнер сеанса, в то время как unset или сброс переменной $_SESSION удалит только данные сеанса для текущего времени выполнения.

12 голосов
/ 04 августа 2009

Это только уничтожает текущий сеанс пользователей, но не весь сеанс других пользователей.

Попробуйте использовать session_save_path (), чтобы узнать, где хранятся данные сеанса, а затем удалите все файлы там.

2 голосов
/ 12 октября 2012

я знаю, что это старая ветка ... но я просто хотел поделиться :) 1001 *

я обнаружил, что вместо использования временной папки для сеанса вы можете сохранить ее в базе данных. так что технически, управление сессиями возможно.

Мой код:

(в основном, плегиаризировано от 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, вы можете видеть, кто находится в сети с помощью идентификатора пользователя (который настраивается с помощью $ _SESSION), и выполнять такие функции, как выход из системы и прочее (вот для чего я его использую).

2 голосов
/ 04 августа 2009

Чтобы уничтожить один сеанс, вы должны использовать следующее: -

session_destroy();

Предполагается, что вы использовали session_start () для предварительного запуска / возобновления сеанса.

Уничтожение всех сеансов действительно зависит от вашей настройки и от того, как вы обрабатываете сеансы.

Для большинства установок PHP обработка сессий выполняется с помощью файлов, поэтому наилучшим способом было бы найти папку, в которой хранятся все сессии (обычно находящиеся в session_save_path ()), и удалить все файлы в этой папке.

Я думаю, что лучший способ справиться с этим, возможно, - предварительно установить временную метку в каждом сеансе, который вы создаете. Это означает, что вы можете сравнить эту временную метку с заданным значением (временем, когда вы хотите аннулировать все сеансы) и сделать недействительным сеанс, если он раньше этого времени. Это также означает, что вы можете делать такие вещи, как установка определенного времени ожидания для сеанса и т. Д. И т. Д.

Другим способом может быть переключение на использование сеансов, хранимых в базе данных - вы можете найти хороший учебник для этого здесь

2 голосов
/ 04 августа 2009

session_name() - это имя, которое передается в файле cookie / строке запроса. Обычно это PHPSESSID , но его можно изменить.

Нет правильного способа уничтожить все сеансы. Как говорит @Marius, вы можете попробовать удалить файлы сессий из session_save_path(), но в лучшем случае это хак.

В качестве альтернативы вы можете использовать session_set_save_handler() для сохранения ваших сессий в том месте, где у вас есть больший контроль, например в базе данных.

1 голос
/ 27 мая 2015

Вам нужно будет удалить записи сеанса.

если сеанс обрабатывается DB - удалить строки.

если сеанс обрабатывается FILES - удалить файлы.

здесь вы можете найти полный пример:

http://mdb -blog.blogspot.co.il / 2015/05 / PHP-destroydelete-все-sessions.html

0 голосов
/ 23 декабря 2016

Чтобы удалить все файлы сессий из 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;
}
0 голосов
/ 09 ноября 2015

Самый простой способ - не удалить все сеансы одновременно, а запомнить последний логин и метку времени сброса сеанса.

//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();
}

Он не удалит все файлы сеанса, но предотвратит запуск старых сеансов. И вам не нужно полагаться на сборщик мусора. Не нашел подобного ответа здесь, поэтому мне пришлось добавить этот. Хорошего дня.

К вашим дальнейшим вопросам:

Ваш код уничтожит только один сеанс и является наиболее распространенным способом, т. Е. Выйти из системы.

session_name даст вам имя переменной, которую php использует для обмена cookie, вам это не понадобится в большинстве случаев. Код, который используется в вашем примере, очень старый, пожалуйста, не используйте его.

Вам не нужно сбрасывать каждый отдельный элемент массива, если вы используете session_destroy или session_unset.

unset ($ _ SESSION) не будет работать.

0 голосов
/ 18 июля 2014

Если вы хотите избежать предупреждения:

Предупреждение: session_destroy (): попытка уничтожить неинициализированный сеанс в ... в строке 18

Не забудьте добавить session_start(); в начало вашего кода. Кроме того, указанный вами код работает как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...