Массивы PHP Session / Cookie на этом же сайте конфликтуют - PullRequest
0 голосов
/ 31 марта 2011

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

(например, $ _SESSION ['name'] будет отображаться на обоих сайтахесли установлено на одном).

Как правильно обрабатывать такие действия, ОСОБЕННО, когда они находятся на одном и том же сайте (представьте, что пользователь-администратор вошел в систему, он вошел в качестве демонстрационного пользователя, чтобы продемонстрировать продукт, а затем решил выйти из системы - что вВ свою очередь, он выводит его из демки, но не из админа.

Какие-нибудь хорошие онлайн-ресурсы для таких?

Выйти

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

<?php
    session_start();

    $_SESSION = array();

    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }

    session_unset();
    session_regenerate_id(true);
    header("Location: page");
    exit;
?>

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Вы не должны пытаться вручную установить cookie сеанса. PHP делает все это за вас.

Если вы хотите завершить сеанс, используйте session_destroy, который полностью сбивает весь сеанс с орбиты. Вам не нужно ничего делать, например, восстановить идентификатор.

Вам не нужно и не следует использовать session_unset, в современном PHP это ничего не делает.

Если вам нужно иметь несколько сеансов в одном домене, вы хотите использовать session_set_cookie_params и session_name до того, как вы позвоните session_start для определения пути и имени файла cookie для этого конкретного «под-сайта». Делайте это независимо для каждого под-сайта. Не используйте одно и то же имя файла cookie сеанса с разными путями, это вызовет немало проблем.

1 голос
/ 31 марта 2011

В сессиях есть несколько правил, которым нужно следовать, чтобы все было правильно.Если вы этого не сделаете, вы будете страдать от всех этих «ошибок», которые будут преследовать ваше приложение.

Использование Framework

Я рекомендую использовать PHP-фреймворк, большинство из них обрабатывают сессии автоматически,Что-то вроде Kohana, CodeIgniter, Zend и т. Д.

Более практичный ответ

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

Скопируйте, что будет делать фреймворк: 1. Создайте файл session_init.php и файл bootstrap.php.В верхней части каждого просматриваемого файла включите ваш файл начальной загрузки, а затем в верхней части файла начальной загрузки включите session_init.2. В session_init.php создайте сеанс

class session{
       static function init() {
               // Configure garbage collection
            ini_set('session.gc_probability', 1);
            ini_set('session.gc_divisor', 1000);
            ini_set('session.gc_maxlifetime', 43200);   

            // Start the session!
            session_name('mysession');
            if(input::get('session_id'))
                session_id(input::get('session_id'));
            if(input::post('session_id'))
                session_id(input::post('session_id'));      
            session_start();

            // Put session_id in the session variable
            $_SESSION['session_id'] = session_id(); 
        }

    static function destroy()
    {
        if (session_id() !== '')
        {
            // Get the session name
            $name = session_name();

            // Destroy the session
            session_destroy();

            // Re-initialize the array
            $_SESSION = array();

        }
    }   
}
session::init();

Путь сеанса будет автоматически установлен в корне домена, что важно, потому что таким образом вам не нужно идти и создавать сеансы длякаждая страница

Когда люди должны выйти из системы, вы запускаете сеанс :: destroy ();

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