Проблема, сбрасывающая переменную сеанса

Да, это потокобезопасно, и да позволяет избежать повсеместного использования блокировок (что бы это ни значило). Конечно, это обеспечит вам потокобезопасный доступ к данным, хранящимся в этом словаре, но если сами данные не являются поточно-ориентированными, то вам, конечно, нужно синхронизировать доступ к ним. Представьте, например, что вы сохранили в этом кэше List. Теперь thread1 выбирает этот список (потокобезопасным способом, так как параллельный словарь гарантирует вам это), а затем начинает перечисление по этому списку. В то же самое время thread2 выбирает тот же самый список из кэша (потокобезопасным способом, поскольку параллельный словарь гарантирует вам это) и записывает в список (например, добавляет значение). Вывод: если вы не синхронизировали thread1, это приведет к проблемам.

Что касается использования его в качестве кеша, то, вероятно, это не очень хорошая идея. Для кеширования я бы порекомендовал вам то, что уже встроено в фреймворк. Классы, такие как MemoryCache , например. Причиной этого является то, что то, что встроено в сборку System.Runtime.Caching , хорошо, явно построено для кэширования => оно обрабатывает такие вещи, как автоматическое истечение срока действия данных, если у вас заканчивается нехватка памяти, обратные вызовы для кеша элементы истечения срока действия, и вы даже сможете распределить свой кэш по нескольким серверам, используя такие вещи, как memcached, AppFabric, ..., все, о чем вы не могли бы и мечтать, используя параллельный словарь.

6
задан Seth 22 June 2009 в 05:40
поделиться

3 ответа

Запустите сеанс до начала буферизации вывода. Итак, переключите вызовы ob_start () и session_start () .

Поскольку файлы cookie сеанса определены в заголовках, отправляемых в браузер, а заголовки отправляются в браузер, когда вы запустить буфер, вы должны запустить сеансы до буфера.

13
ответ дан 8 December 2019 в 13:01
поделиться

Приведенный вами пример должен работать. Возможно, вам мешает какой-то сеансовый кеш. Вы можете попробовать изменить свой код следующим образом:

if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) {

    $error = $_SESSION['invite_errors'];
    $_SESSION['invide_errors'] = false;
    unset($_SESSION['invite_errors']);

    // Explicitly write and close the session for good measure
    session_write_close();

}
2
ответ дан 8 December 2019 в 13:01
поделиться

Возможно, вы сможете изменить значение после того, как отобразите ошибку

if (isset($_SESSION['invite_error'])) {
   echo $_SESSION['invite_error'];
   $_SESSION['invite_error'] = null;
   unset($_SESSION['invite_error']);
}
1
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

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