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

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

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

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

Предоставленный код просто удаляет данные сеанса текущего сеанса. $_SESSION = array(); оператор просто сбросит переменную сеанса $_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 удалит весь контейнер сеанса, в то время как сброс или сброс переменной $_SESSION удалит только данные сеанса для текущей среды выполнения.

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

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

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

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

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

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

 session_destroy(); 

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

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

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

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

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

я знаю, что это старый поток … но я просто хотел поделиться 🙂

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

Мой код:

(в основном плагиат из 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("Ymd H:i:s"); $c = date("Ymd 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("Ymd 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('Ymd H:i:s'); $dt1 = strtotime("$real_now -$max_lifetime seconds"); $dt2 = date('Ymd 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), и выполнять такие функции, как их выведение из системы и прочее (для чего они используют его).

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

если сеанс обрабатывается БД – удалите строки.

если сеанс обработан FILES – удалите файлы.

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

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

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

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

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

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

 //Start your session session_start(); //Get your stored timestamp of reset //(ie stored in database) $timestamp_reset = ... //Get your stored timestamp of your session //(ie 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) не будет работать.

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