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>";