два session_starts () вешают PHP-приложение - PullRequest
0 голосов
/ 26 февраля 2009

Контекст: я собирался создать приложение, используя mod_rewrite (загрузка дочерних страниц лицевой страницы), но застрял при загрузке страниц session_enabled со страницы фронт-контроллера.

Проблема: проблема в том, что я использую функцию session_start () twise, страница PHP перестает отвечать. Что странно, функция session_start безвредна и вызывается на разных страницах.

Я сузил задачу до этого образца:

файл child.php:

файл parent.php:

При вызове parent.php браузер будет загружаться бесконечно. Как только вы прокомментируете один из вызовов session_start () - он загружается мгновенно.

В чем источник проблемы? Мне очень нужны страницы с поддержкой сеансов.

PS Я могу обойти это, включив страницы, но они основаны на параметрах URL, я бы не хотел их исправлять ради каких-то прокси-серверов параметров.

Ответы [ 5 ]

5 голосов
/ 26 февраля 2009

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

От Ману л:

Данные сеанса обычно сохраняются после ваш сценарий завершен без нужно позвонить session_write_close(), но так как данные сеанса заблокированы предотвратить одновременную запись только одного Скрипт может работать на сессии в любой время. При совместном использовании фреймов с сеансами вы испытаете загрузка кадров по одному из-за этого замок. Вы можете сократить время необходимо загрузить все кадры по окончание сеанса, как только все внесены изменения в переменные сеанса.

1 голос
/ 26 февраля 2009

Кроме того, одновременно можно использовать только один сеанс. Вам нужно вызвать функцию session_regenerate_id , чтобы сгенерировать новый идентификатор:

if (session_id() != '') {
    session_write_close();
}
session_start();
session_regenerate_id();

В противном случае идентификатор сеанса родителя также будет использоваться для сеанса ребенка.

1 голос
/ 26 февраля 2009

Вы также можете проверить, запущен ли уже сеанс, и только начать новый, если нет:

    if (!isset($_SESSION)) session_start();
1 голос
/ 26 февраля 2009

Попробуйте использовать session_write_close () перед загрузкой своей дочерней страницы.

0 голосов
/ 26 февраля 2009

Наличие в вашем скрипте двух session_starts () в любом случае плохо.

Почему бы вам просто не начать сеанс в файле parent.php (а не child.php)? Или просто child.php, а не parent.php

Хорошей идеей будет иметь одну страницу, которая будет включена во все остальные страницы, которая инициализирует все (соединение SQL, запуск сеанса и т. Д.). А затем включите эту страницу на всех остальных.

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