Сессия PHP, уничтоженная / потерянный после заголовка

У меня есть сценарий, который устанавливает некоторые значения сессии прежде, чем перенаправить к / использование header().

Я прочитал много сообщений о $_SESSION переменная, уничтожаемая / потерянный после header(), даже после того, как я реализовал это:

// set session here

session_regenerate_id(true);
session_write_close();
header("Location: /");

session_start() установлен в корректных местах, кто-либо знает чего-нибудь, что я мог бы отсутствовать?

На index.php странице у меня есть это:

session_start();
print_r($_SESSION);

// outputs nothing :'(

Код довольно сложен, так не отправит все это, просто отрывки.

15
задан Ben Everard 10 January 2010 в 14:42
поделиться

4 ответа

Чтобы закрыть этот вопрос, мы пришли к выводу, что это проблема с конфигурацией сервера, что неудивительно, учитывая, что хост хорошо известен для такого рода вещей.

3
ответ дан 1 December 2019 в 03:14
поделиться

Моя рекомендация:

Разрешить помечать свойства как индексируемые. Ограничение количества индексируемых свойств и столбцов на объект. Наличие большого жесткого ограничения на общие типы столбцов во всех объектах.

Реализовать индексы как отдельные таблицы (по одной на индекс), соединенные с основной таблицей данных (основная таблица имеет большой уникальный ключ для объекта). (При необходимости можно создать/удалить индексные таблицы).

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

Используйте кварки для идентификаторов полей (но только в главном ядре для экономии оперативной памяти и ускорения некоторых операций чтения - не полагайтесь на сравнение кварковых указателей во всех случаях).

Моя мысль о ваших вариантах:

1 - это возможно. Очевидно, что производительность будет ниже, чем при отсутствии столбцов идентификаторов полей.

2 не является общим механизмом БД и не все рады изменениям динамической схемы. Но возможно да, если ваш механизм БД хорош в этом.

3 Возможно.

4 Да, хотя я бы использовал JSON.

5 Кажется 4 только менее оптимизирован??

6 Звучит хорошо; был бы с, если бы рад попробовать что-то новое, а также, если бы рад надежности и производительности, но обычно хотел бы пойти с более массовой технологии. Я также хотел бы уменьшить количество двигателей, участвующих в координации транзакции, до меньшего, чем было бы здесь.

Edit : Конечно, хотя я рекомендовал что-то, здесь не может быть общего правильного ответа - профилировать различные модели данных и подходы с вашими данными, чтобы увидеть, что работает лучше для вашего приложения.

Изменить: Изменить последнюю редактируемую формулировку.

-121--2224884-

Если пустая дата действительно вызывает ошибку, можно также создать более простую структуру времени :

// more work is required to make this even close to production ready
class Time
{
    // TODO: don't forget to add validation
    public int Hours   { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public override string ToString()
    {  
        return String.Format(
            "{0:00}:{1:00}:{2:00}",
            this.Hours, this.Minutes, this.Seconds);
    }
}

Или, зачем беспокоиться: если вам не нужно делать вычисления с этой информацией, просто сохраните ее как Последовательности .

-121--602091-

Я никогда не видел никаких проблем, связанных с сеансом, из-за использования заголовков местоположения - Вы уверены, что вызываете session _ start на обеих страницах?


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

11
ответ дан 1 December 2019 в 03:14
поделиться

Заголовок должен быть отправлен до закрытия сеанса

session_regenerate_id(true);

header("Location: /");
// the header must be sent before session close
session_write_close(); // here you could also use exit();
5
ответ дан 1 December 2019 в 03:14
поделиться

просто введите exit; после заголовка: D Я решил это

4
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: