PHP Несколько одновременных сеансов на пользователя
Я работаю над веб-приложением, использующим PHP на Apache. Переменные $_SESSION используются довольно часто для информации, которая должна сохраняться на разных страницах.
Нам нужен каждый пользователь, чтобы иметь возможность открывать несколько параллельных сеансов, будь то новые вкладки или новые окна, в зависимости от выбора браузера. Прямо сейчас, когда пользователь открывает вкладку или окно добавления и переходит на сайт, существующий сеанс принимается. Как я могу предотвратить это, так что пользователь должен (или может) войти в систему и начать новый сеанс, не вмешиваясь в какие-либо существующие сеансы (ы), которые они уже открыли?
Нашим временным решением является использование нескольких браузеров (IE и FF), но это, очевидно, не очень желательный способ сделать что-то.
Ответы
Ответ 1
Поведение, которое вы описываете, противоречит концепции сеанса браузера. Почему пользователю требуется более одного сеанса? Является ли это вопросом контроля доступа к пользователю, который необходимо выполнить? Если это так, назначьте пользователей логическим группам и предоставите разрешения определенным группам. Нужно ли пользователям выполнять какие-либо действия от имени других пользователей? Если это так, создайте веб-сайт вокруг этой концепции вместо того, чтобы пытаться создать несколько сеансов для одного пользователя.
Если вам действительно нужно это сделать, вы можете сделать что-то ужасное, например, пройти по параметру запроса (очень небезопасно!) между страницами, чтобы действовать как идентификатор сеанса, в обход фактической $_SESSION в целом и управление собственной концепцией сеанса. Опять же, это не нормально и приведет только к головным болям/проблемам безопасности в будущем.
Ответ 2
Доступ к неатомическому параллельному сеансовому управлению можно моделировать с помощью следующей псевдокодированной логики:
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(){}
}
}
Ответ 3
Это было бы очень сложно сделать, если это вообще возможно.
Сессии не должны беспокоиться о том, на какой вкладке они находятся.
Также, что произойдет, если сеанс 1 в закладке 1 откроет новое окно? Это новый сеанс?
Ответ 4
Вот как это сделать:
- Сначала отключить файлы cookie сеанса в php.ini с помощью:
session.use_cookies = 0
Это гарантирует, что файлы cookie не используются для передачи идентификатора сеанса.
-then Убедитесь, что вы создали все свои URL-адреса с включенным идентификатором сеанса (вы получаете его через функцию session_id(), например:
print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";