Я работаю над веб-приложением, используя PHP на Apache. Переменные $ _SESSION используются довольно часто для информации, которая должна сохраняться на разных страницах.
Нам нужен каждый пользователь, чтобы иметь возможность открывать несколько параллельных сеансов, будь то новые вкладки или новые окна, в зависимости от выбора браузера. Прямо сейчас, когда пользователь открывает вкладку или окно добавления и переходит на сайт, существующий сеанс принимается. Как я могу предотвратить это, так что пользователь должен (или может) войти в систему и начать новый сеанс, не вмешиваясь в какие-либо существующие сеансы (ы), которые они уже открыли?
Нашим временным решением является использование нескольких браузеров (IE и FF), но это, очевидно, не очень желательный способ сделать что-то.
Поведение, которое вы описываете, противоречит концепции сеанса браузера. Почему пользователю требуется более одного сеанса? Является ли это вопросом контроля доступа к пользователю, который необходимо выполнить? Если это так, назначьте пользователей логическим группам и предоставите разрешения определенным группам. Нужно ли пользователям выполнять какие-либо действия от имени других пользователей? Если это так, создайте веб-сайт вокруг этой концепции вместо того, чтобы пытаться создать несколько сеансов для одного пользователя.
Если вам действительно нужно это сделать, вы можете сделать что-то ужасное, как пройти по параметру запроса ( очень небезопасно! ) Между страницами, чтобы действовать как идентификатор сеанса, в обход фактической $ _SESSION в целом и управлять собственной концепцией сеанса. Опять же, это не нормально и приведет только к головным болям / проблемам безопасности в будущем.
Доступ к неатомическому параллельному сеансовому управлению можно моделировать со следующей псевдокодированной логикой:
function main(){ $locker = new SessionLocking(); /** read elements the $_SESSION "cached" copy. **/ $var1 = $_SESSION['var1']; $var2 = $_SESSION['var2']; /** Pseudo Atomic Read **/ $locker->lock(); //session is locked against concurrent access. $var3 = $_SESSION['var3']; $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script. /** Psuedo Atomic Write **/ $locker->lock(); //session is locked against concurrent access. $_SESSION['var4'] = "Some new value"; $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script } CLASS SessionLocking { private static $lockCounter=0; private static $isLoaded=false; function __constructor(){ if (!self::$isLoaded) load(); } private function load(){ $this->lock(); $this->unlock(); } private function lock(){ if ($lockCounter<1) try {session_start();} Catch(){} $lockCounter++; } private function unlock(){ if ($lockCount<1) return; $lockCounter--; if ($lockCounter<1) try {session_write_close();} Catch(){} } }
Это было бы очень сложно сделать, если это вообще возможно.
Сессии не должны беспокоиться о том, на какой вкладке они находятся.
Также, что произойдет, если сеанс 1 в закладке 1 откроет новое окно? Это новый сеанс?
Вот как это сделать:
-Первый отключить cookies сессии в php.ini с:
session.use_cookies = 0
Это гарантирует, что файлы cookie не используются для передачи идентификатора сеанса.
Затем убедитесь, что вы создали все свои URL-адреса с включенным идентификатором сеанса (вы получаете его через функцию session_id (), например:
print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";