неясность о session_destroy

Я искал, искал, читал и читал много о том, что именно делает session_destroy! но никакого результата по крайней мере для меня! сначала прочтите подробности ниже:

Когда создается сеанс (session_start), создается файл с уникальным идентификатором, который предоставляется пользователю в виде файла cookie, когда переменные в массиве $ _SESSION изменяются или добавляются, временный файл обновляется этой информацией, чтобы его можно было используется где-то еще на веб-сайте. *

session_destroy * удалит этот файл, обычно это делается, когда пользователь выходит из вашего веб-сайта, чтобы файл (теперь бесполезный и ненужный) не занимал места.

мы знаем, что идентификатор сеанса хранится в файле cookie сеанса, и, как говорится в учебниках, удаление сеанса удаляет файл cookie сеанса (который включает session_id), так почему, когда я начал новый сеанс, он не сгенерировал новый идентификатор! это меня сбивает с толку! посмотрите на пример :

<?php
    session_start();
     echo session_id();
    session_destroy();
    session_start();

     echo "---".session_id();
?>

результат: l4k80dkrl5kd6cdlobhbu5s3i1 --- l4k80dkrl5kd6cdlobhbu5s3i1

поэтому он дает мне идентификатор сеанса, такой же, как и в предыдущем.

Итак, что на самом деле делает session_destroy !! ?

заранее спасибо


person Mehdi    schedule 03.09.2015    source источник


Ответы (2)


Из документации PHP:

Он не сбрасывает ни одну из глобальных переменных, связанных с сеансом, и не сбрасывает cookie сеанса.

Таким образом, после session_destroy() cookie, содержащий идентификатор сеанса, все еще жив, и будет удален только файл сеанса. Итак, start_session() пытается найти файл для идентификатора сеанса в cookie, и, конечно же, он терпит неудачу и просто создает для этого новый пустой файл. Так что ваш id не меняется.

Если вы действительно хотите это изменить, попробуйте удалить файл cookie.

person Ahmad    schedule 03.09.2015
comment
Итак, что такое файл сеанса? - person Pooya sanaei; 03.09.2015
comment
Файл сеанса, о котором мы говорим, - это обычный файл, созданный на стороне сервера, файлы cookie хранятся на стороне клиента ... давайте, ребята! - person DJ'; 03.09.2015
comment
Некоторые текстовые файлы, содержащие данные сеанса, на сервере - person Ahmad; 03.09.2015
comment
а где именно хранится этот файл сеанса !? - person Mehdi; 03.09.2015
comment
Это варьируется на разных серверах. Вы можете получить его по session_save_path() - person Ahmad; 03.09.2015
comment
ухм! Благодарность ! Еще одна вещь, что в этом файле !? - person Mehdi; 03.09.2015
comment
Просто переменные сеанса в специальном формате. Откройте один из них, и вы увидите - person Ahmad; 03.09.2015

Вы почти правы в том, что сказали, НО, если вы уничтожите сеанс и сценарий завершится на PHP, тогда файл будет удален. Если вы просто попытаетесь уничтожить и создать его снова, он будет использовать тот же идентификатор файла / сеанса.

Это не только файл, который создается, но также файл содержит все данные, которые вы храните в сеансе. Взгляните на данные вашей сессии на вашем сервере, это очень интересно.

Обновить. Вы можете сделать больше интересных вещей. Напишите файл PHP

<?php
session_start();
sleep(29000);//delete the session after 29 seconds
session_destroy();
?>

Теперь посмотрите на файл сеанса, он должен быть удален через 20 секунд.

Do

<?php session_start(); ?>

и перейдите в google chrome и вручную удалите файл cookie. Сеанс больше не будет доступен.

<?php session_destroy(); ?> не уничтожает файлы cookie на стороне клиента. В следующий раз, когда вы создадите сеанс, он просто будет использовать ту же старую информацию. Это основная причина вашего вопроса.

Сделайте file1:

<?php session_start(); $_SESSION['test'] = "A"; ?>

файл2:

<?php session_start(); $_SESSION['test'] = "B"; ?>

resultFile:

<?php session_start(); echo $_SESSION['test']; ?>

Теперь с двух компьютеров зайдите на свой веб-сайт с помощью file1 на одном компьютере и file2 на другом. Из google chrome переключите информацию об их файлах cookie и посмотрите, как сеанс A назначается B, а сеанс B назначается A.

person DJ'    schedule 03.09.2015
comment
Так почему это должно происходить? Когда я удалил файл cookie сеанса с уничтожением сеанса! Как он получает идентификатор сеанса? - person Mehdi; 03.09.2015
comment
Как вы удалили файл cookie сеанса? - person DJ'; 03.09.2015
comment
Вызывая session_destroy - person Mehdi; 03.09.2015
comment
session_destroy () не удаляет cookie (или любой другой источник идентификатора сеанса). см. docs.php.net/session_destroy - person VolkerK; 03.09.2015
comment
Как я читал в интернет-сеансе, уничтожение удаляет файлы, в которых находится идентификатор сеанса (файл cookie сеанса) - person Mehdi; 03.09.2015
comment
<?php session_destroy(); ?> не уничтожает файлы cookie на стороне клиента. В следующий раз, когда вы создадите сеанс, он просто будет использовать ту же старую информацию. Это основная причина вашего вопроса. - person DJ'; 03.09.2015
comment
session destroy removes the files which session id ...(session_cookie) - нет, это не так. session_destroy удаляет файл (или любое другое сконфигурированное хранилище) на сервере; это файл, содержащий данные сеанса, более или менее то, что вы найдете в _SESSION. Он также удаляет данные, которые в настоящее время используются модулем сеанса. Но это не влияет ни на данные клиента, ни на данные запроса. Esp. последнее является причиной того, что вы получаете тот же sesion_id при повторном вызове session_start. Но данные (на сервере ‹-› _SESSION), связанные с этим session_id, исчезли. - person VolkerK; 03.09.2015
comment
VolkerK прав. Session_destroy очищает память, используемую массивом $ _SESSION. Примечание. Код C для PHP --- ›ZVAL_UNDEF(&PS(http_session_vars)); вызывается в php_rinit_session_globals() и php_rshutdown_session_globals(), что используется в session_destroy(), а также вызывает функцию закрытия обработчика сеанса с PS(mod)->s_close(&PS(mod_data)); в функции php_rshutdown_session_globals - person Raymond Nijland; 03.09.2015