PHP每个用户有多个并发会话

PHP每个用户有多个并发会话,php,session-variables,multiple-instances,Php,Session Variables,Multiple Instances,我正在Apache上使用PHP开发一个web应用程序$_会话变量被大量用于必须跨页面持久化的信息 我们需要每个用户能够打开多个并发会话,可以是新的选项卡,也可以是新的窗口,这取决于他们选择的浏览器。现在,当用户打开“添加”选项卡或窗口并访问站点时,现有会话将被采用。如何防止这种情况发生,以便用户必须(或可能)登录并启动新会话,而不会干扰他们已打开的任何现有会话 我们的临时解决办法是使用多个浏览器(IE和FF),但这显然不是一种非常理想的方式。如果可能的话,这将非常困难 会话不必担心它们在哪个选项

我正在Apache上使用PHP开发一个web应用程序$_会话变量被大量用于必须跨页面持久化的信息

我们需要每个用户能够打开多个并发会话,可以是新的选项卡,也可以是新的窗口,这取决于他们选择的浏览器。现在,当用户打开“添加”选项卡或窗口并访问站点时,现有会话将被采用。如何防止这种情况发生,以便用户必须(或可能)登录并启动新会话,而不会干扰他们已打开的任何现有会话


我们的临时解决办法是使用多个浏览器(IE和FF),但这显然不是一种非常理想的方式。

如果可能的话,这将非常困难

会话不必担心它们在哪个选项卡中


另外,如果选项卡1中的会话1打开一个新窗口,会发生什么情况?这是新会话吗?

您描述的行为与浏览器会话的概念相反。为什么用户需要多个会话?是否需要实施用户访问控制?如果是这样,请将用户分配到逻辑组并向特定组授予权限。用户是否需要代表其他用户执行某些操作?如果是这样,就围绕这个概念设计网站,而不是试图为一个用户创建多个会话


如果您真的必须这样做,您可以做一些可怕的事情,比如在页面之间传递查询参数(非常不安全!),作为会话ID,完全绕过实际的$\u会话,并管理您自己的会话概念。同样,这是不正常的,将来只会导致头痛/安全问题。

可以使用以下伪编码逻辑模拟非原子并发会话管理访问:

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(){}
}
}
函数main(){
$locker=新会话锁定();
/**读取$\u会话“缓存”副本中的元素**/
$var1=$_会话['var1'];
$var2=$_会话['var2'];
/**伪原子读**/
$locker->lock();//会话被锁定,不允许并发访问。
$var3=$_会话['var3'];
$locker->unlock();//会话已提交到磁盘(或其他)并可由其他脚本访问。
/**伪原子写入**/
$locker->lock();//会话被锁定,不允许并发访问。
$\u会话['var4']=“一些新值”;
$locker->unlock();//会话已提交到磁盘(或其他)并可由其他脚本访问
}
类会话锁定{
私有静态$lockCounter=0;
私有静态$isLoaded=false;
函数_构造函数(){
如果(!self::$isLoaded)load();
}
私有函数加载(){
$this->lock();
$this->unlock();
}
私有函数锁(){

如果($lockCounter这里有一种方法:

-首先使用以下命令禁用php.ini中的会话cookie:

session.use_cookies = 0
这确保不会使用Cookie传递会话id

-然后确保生成包含会话id的所有URL(通过函数session_id()获取,例如:

print”“;

知道这是一个很晚的答案

作为开发人员,我通常需要同时测试不同用户类型(管理员、注册用户、访问者等)的界面。Firefox浏览器有一个“多帐户容器”附加组件,除其他外,将cookie按容器分隔。可以根据需要创建任意多个容器,并在每个容器中打开选项卡。每组包含的选项卡共享cookie,但不跨容器共享。浏览器将使用不同的独立“PHPSESSID”(或您如何命名cookie),因此能够同时处理多个会话


还有其他扩展和注意事项,如特殊书签等,但它们超出了这里的问题范围。

这是我在这件事上能找到的最好的书面材料:@onteria_u这似乎是滥用:
所以,每个链接、表单、标题()Javascript代码会将会话名称值转发到下一个脚本,它会知道它必须使用的会话。
不可能。您需要编写自己的会话处理脚本,并在每个URL中附加“如果通过则通过”。
在每个URL中附加“如果通过则通过”
可能会出现什么问题?我们有这个nee的原因是什么d是由于应用程序的使用方式。例如,销售人员可能需要在任何给定时间打开多个订单输入屏幕。这可能是因为一个客户由于各种原因需要临时移交给另一名员工。然后,销售人员需要能够为队列中的下一个人启动新订单,不干扰已经打开的订单,订单将在原始客户返回时完成。对于旧系统,这是通过打开应用程序的多个副本来完成的(不是基于web的)。啊,我现在明白了。:)你可以改变网站的工作方式,使其在会话中不保留销售人员的当前订单。相反,你可以使用一种更安静的方式[,其中销售人员正在更新的订单ID是网页URL的一部分。这样,他们可以打开两个选项卡/窗口并修改两个订单,会话将完全从图片中删除。接受上述评论的答案,而不是答案本身。
print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";