#php #session #logout
#php #сессия #Выход
Вопрос:
Для выхода пользователя с моего веб-сайта я перенаправляю страницу на logout.php
, где я использую функцию session_destroy(). Даже там функциональность выхода из системы не работает без session_start()
функции. Добавив функцию session_start() перед session_destroy()
функцией, я могу успешно выйти из системы пользователя.
Почему мне нужно использовать session_start()
функцию каждый раз и на каждой странице, где я делаю что-то, связанное с сессиями?
Ответ №1:
session_destroy() уничтожает активный сеанс. Если вы не инициализируете сессию, уничтожать будет нечего.
Комментарии:
1. Итак, нужно ли мне инициализировать сеанс на каждой странице, где страницу могут видеть только зарегистрированные пользователи? Я думал, что при вызове session_start () каждая страница узнает, что установлена переменная сеанса.
2. Абсолютно. Если вы когда-либо имеете дело с сессиями в запросе, вам необходимо вызвать session_start (), чтобы предоставить PHP информацию о сеансе.
3. ИЛИ вы могли бы использовать session.auto_start = 1 (это не лучшая практика, но это возможно =)
Ответ №2:
Почему мне нужно использовать функцию session_start () каждый раз и на каждой странице, где я делаю что-то, связанное с сессиями?
Таким образом, PHP знает, какую сессию уничтожить. session_start()
проверяет, присутствует ли файл cookie сеанса или идентификатор. Только с этой информацией вы можете ее уничтожить.
Комментарии:
1. Спасибо Pekka за ответ. Могу ли я создать более одной сессии? Например, я вызываю функцию session_start() 4 раза. Это создает 4 сеанса?
2. Вероятно, вы создаете только один сеанс. После вызова вашей первой функции session_start (), если вы не укажете другой идентификатор сеанса для последующих вызовов session_start (), по умолчанию используется исходный идентификатор сеанса (сохраненный в файлах cookie пользователя или URL).
3. @iSumitG Что говорит @John. Я думаю, что запуск сеанса более одного раза даже выдает ошибку — и это не имело бы смысла в первую очередь
4. @Pekka, вы можете запускать только один сеанс одновременно, правильно. Однако вы можете запускать, поддерживать и сохранять несколько сеансов на одном сайте для пользователя, принудительно вводя идентификатор сеанса перед
session_start
. Примерами этого могут быть сеансы сайта / форума или сеансы корзины.5. Если вы хотите использовать rediculous, вы могли бы даже жонглировать (теоретически): P
Ответ №3:
В конфигурации по умолчанию сеансы PHP работают с жесткого диска. PHP просит вас явно сообщить ему, когда вам понадобится эта поддержка, чтобы избежать ненужного ввода-вывода с диска.
session_start()
также сообщает PHP узнать, существует ли сессия пользователя.
Ответ №4:
session_start () создает сеанс или возобновляет текущий на основе идентификатора сеанса, переданного через запрос GET или POST, или переданного через cookie.
согласно http://php.net/manual/en/function.session-start.php
По сути, вызывая session_start()
, PHP считывает заголовок и делает перекрестные ссылки с идентификатором сеанса на то, что находится в вашей системе (файловая система / база данных / etc), Которая затем может заполнить то, $_SESSION
что относится к этому конкретному пользователю. Которая, в свою очередь, позволяет вам вызывать session_destroy()
, потому что она знает, какой сеанс на самом деле уничтожить.
Ответ №5:
рассматривайте session_start () как ваш способ сообщить движку php …. что вы хотите работать с сессиями.
и, насколько я понимаю, всегда делайте так, чтобы это была первая строка на странице php.
Ответ №6:
Меня смущало использование session_start(); и каждый раз, когда я использовал переменную сеанса, я вызывал session_start. Точно, у меня была функция session_start(); более одного раза на каждой странице (даже без вызова session_destroy()). Например,
// 1st call
session_start();
if (!isset($_SESSION['UserID']))
{
// Do something
}
else
{
// Do something else
}
// .... some other code
// 2nd call
session_start();
if (!isset($_SESSION['UserID']))
{
// Do something totally different
}
else
{
// Do something else totally different
}
Это создавало для меня проблему с производительностью. В итоге я вызвал session_start();
только один раз в самом верху страницы, и, кажется, все работает нормально.
Ответ №7:
Вы должны вызвать session_start один раз (и только один раз) в каждом файле, в котором вы хотите, чтобы сеансы работали.
Общий подход, позволяющий вызывать ее только один раз, заключается в том, чтобы иметь файл диспетчера в качестве вашего index.php ; вызовите session_start здесь и включите на эту страницу другие на основе URL-адреса $ _GET.
<?php
session_start();
if(isset($_GET['page']) amp;amp; file_exists('pages/'.$_GET['page'].'.php') {
include $_GET['page'];
}
?>
//www.mysite.com/index.php?page=fish will display /pages/fish.php with session access