Даже если сборщик мусора включится и удалит файл сеанса, который вы открыли / прочитали с помощью session_start()
, он НЕ попадет в кишки этого конкретного процесса PHP и не удалит массив объектов $_SESSION
.
Предполагая, что вы работаете со стандартным файловым обработчиком сеанса (который содержит serialize()
'копию $_SESSION
), вот что происходит.
- Файл сеанса находится в своем временном каталоге
- Вы
session_start()
, что заставляет PHP открывать / блокировать файл, читать его содержимое, десериализовывать данные и, между прочим, возможно обновлять метку времени последнего использования файла сеанса (atime на блоках Unix).
- Если звезды и луна правильно выровнены с асцендентом Нептуна в пятом доме, сборщик мусора сессии МОЖЕТ запустить и удалить старые файлы сессии.
- Сборщик мусора выполнит итерацию по каталогу сеанса и удалит все файлы, которые старше max_liftime, НО НЕ УДАЛИТ ЛЮБЫХ ФАЙЛОВ, В КОТОРЫХ В НАСТОЯЩЕЕ ВРЕМЯ ОТКРЫТО / В ИСПОЛЬЗОВАНИЕ . Поскольку вы не закрыли () сеанс, файл сеанса все еще используется, поэтому не будет удален.
Теперь, если вы сделали что-то вроде этого:
ini_set(...); // set GC probability to max, short session lifetime, etc...
session_start(); // populate $_SESSION
session_write_close(); // dump $_SESSION out to file, close file, release lock.
sleep(7); // Sleep for 7 seconds;
session_start(); // re-populate $_SESSION;
Теперь вы можете просто получить новый пустой $ _SESSION, IF , который решит запустить сборщик мусора. Однако, если вы не сделаете эту секунду session_start()
, старые данные $ _SESSION из предыдущего start () вызов БУДЕТ ЕЩЕ НАСТОЯЩИМ . Возможно, файл сеанса был удален, но сборщик мусора не будет касаться того, что присутствует в памяти вашего скрипта, во время его работы.