Это правильный способ уничтожить все данные сеанса в php?

Получил это из 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[])?

Ответы

Ответ 1

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

Теперь на ваши вопросы:

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

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

См. также Поистине уничтожить сеанс PHP?

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

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

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

Нет. Начальный $_SESSION = array(); удаляет все данные сеанса.

Чем отличается использование session_destroy и unset ($ _ SESSION [])??

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

session_destroy();

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

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

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

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

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

Ответ 5

Я знаю, что это старый поток... но я просто хотел поделиться:)

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

Мой код:

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

Ответ 6

Вам придется удалить записи сеанса.

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

если сеанс обработан ФАЙЛЫ - удалите файлы.

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

http://mdb-blog.blogspot.co.il/2015/05/php-destroydelete-all-sessions.html

Ответ 7

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

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

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

Ответ 8

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

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

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

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

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

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

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

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

Ответ 9

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