Как мне устранить проблемы с сессиями? - PullRequest

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Как определить, какой механизм вызывает session_start для создания новых сессий, а не возобновления предыдущих?

Это видно в исходном коде PHP для session_start функция .Вам нужно прочитать C-код и сравнить с вашим использованием.

Из того, что я знаю о сеансах, session_start не начнет новый сеанс, если он уже активен.Чтобы узнать, активен ли уже сеанс, см. Как узнать, активен ли сеанс? .

Однако, если сеанс запущен (и его не было раньше), изатем закрывается и вы создаете новый сеанс в том же запросе, PHP может подумать, что сеанс не существует (потому что cookie из браузера по-прежнему пуст).И тогда будет запущен второй, также новый, сеанс.

Если вы не уверены, что и для чего, просто создайте себе тестовый сценарий, в котором вы поиграете со сценариями.

Возможный сценарий:

  1. Браузер отправляет запрос
  2. PHP запускается
  3. session_start() вызывается.Сеансового cookie не существует, PHP создаст новый идентификатор сеанса и создаст заголовки cookie.
  4. вы закрываете сессию.
  5. session_start() вызывается.Сеансовый cookie не существует (в запросе), PHP создаст новый идентификатор сеанса и создаст заголовки cookie.

Создано два сеанса, один из которых не будет использоваться браузером для последующих запросов.(заголовок идентификатора сеанса для cookie был «перезаписан» (последний заголовок cookie заменяет предыдущие для рассматриваемого cookie).

Для отладки можно использовать headers_listа также $_COOKIES.

1 голос
/ 26 декабря 2011

Позвольте мне объяснить, как работает сеанс, PHP сохраняет переменные где-то на стороне сервера (неважно, где именно это объяснение) и ассоциирует его с уникальным идентификатором (то есть Session ID ), затем он предоставляет идентификатор сеанса пользователю одним из двух способов:

  1. Через переменную GET в URL (example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56)
  2. Посредством Cookie, отправленного в заголовках.

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

Вы описываете проблему, когда PHP не находит соответствия и генерирует новый идентификатор сеанса вместо продолжения с существующим. Вероятно, это означает, что существует проблема в том, как клиент отправляет идентификатор сеанса на сервер.

Это означало бы одну из двух проблем:

  1. Пользователь зашел на сайт без переменной GET, которая включает идентификатор сеанса: (example.com вместо example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56).
  2. Пользователь не имеет разрешенных файлов cookie или удалил свои файлы cookie в промежутке между сеансами.

Проверьте эти два, вряд ли это будет проблемой в движке PHP.

0 голосов
/ 27 декабря 2011

Под php.net session_id ()

В php версии 5.3.2 в моем случае каждый раз новый идентификатор сессии был генерируется после session_start (), но до этого все работало правильно в предыдущих версиях. Поэтому я потерял данные из моего текущего сеанса (неправильно идентификатор сессии). Всегда был доступен $ _POST или $ _GET или $ _COOKIE с именем сеанса и идентификатором сеанса, поэтому session_start () был взят это автоматически. Теперь мне нужно выполнить session_id (.. old id ..) до session_start () и сеанс запускается для того же идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...