Это правильный способ уничтожить все данные сеанса в 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;
}