Что происходит с массивом $ _SESSION, если время сеанса PHP заканчивается в середине запроса? - PullRequest
3 голосов
/ 16 июня 2009

Я всегда задавался вопросом: если время сеанса PHP истекло во время выполнения скрипта, будет ли содержимое массива $ _SESSION оставаться доступным до тех пор, пока не закончится выполнение скрипта? Например:

session_start();

if(! isset($_SESSION['name'])) {
    echo 'Name is not set';
    exit;
}

// imagine there is a bunch of code here and that the session times out while
// this code is being executed

echo 'Name is ', $_SESSION['name']; // will this line throw an error?

Целесообразно ли копировать переменные сеанса в локальную область видимости, чтобы я мог прочитать их позже в сценарии, не проверяя время ожидания сеанса? Что-то вроде:

session_start();

if(isset($_SESSION['name'])) {
    $name = $_SESSION['name'];
} else {
    echo 'Name is not set';
    exit;
}

// bunch of code here

echo 'Name is ', $name;

Ответы [ 4 ]

7 голосов
/ 16 июня 2009

не беспокойтесь о таких вещах. С сеансом ничего не случится. Он инициализируется sessioni_start() и $_SESSION всегда будет доступен в вашем скрипте.

2 голосов
/ 16 июня 2009

Переменные копируются в глобальную переменную $ _SESSION при первоначальном запросе, поэтому она имеет тот же эффект, что и копирование в локальную переменную.

Однако для ясности имеет смысл скопировать его в локальную переменную. Особенно, если вы планируете использовать переменную несколько раз. Может быть трудно прочитать код, который имеет $ _SESSION ['variable'] повсюду.

2 голосов
/ 16 июня 2009

Время трехчасового сеанса по умолчанию сбрасывается каждый раз, когда вы открываете сеанс (см. session_cache_expire), поэтому единственный путь, по которому сеанс может быть остановлен в середине запроса, - это если запрос Процесс занимает три часа. По умолчанию PHP запрашивает время ожидания только через 30 секунд, поэтому нет опасности истечения сеанса во время запроса. Кроме того, переменная $_SESSION не будет внезапно меняться в середине запроса. Он заполняется, когда начинается сессия, и все.

0 голосов
/ 16 июня 2009

То, что вам нужно было понять, это то, как работают сессии. Клиент, обращающийся к сценарию с помощью суперглобального $ _SESSION, знает только ключ к сеансу, который ему принадлежит (хранится в Cookie / URL). Это означает, что сами данные сеанса не имеют ничего общего с клиентом. Если у вас есть ключ к данным сеанса, который вы хотите использовать, вы можете использовать его. В старых версиях PHP были некоторые дыры в безопасности, потому что сессии были где-то легко доступны (я не помню подробностей).

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

Надеюсь, это поможет, в противном случае зайдите на php.net и погрузитесь в детали того, как работают сессии.

...