Функция PHP session_start (): Зачем мне это нужно каждый раз, когда я использую что-либо, связанное с сессиями PHP

#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