2011-05-20 35 views
14

Estoy trabajando en una aplicación web usando PHP en Apache. Las variables $ _SESSION se usan bastante para la información que debe persistir en todas las páginas.PHP Sesiones concurrentes múltiples por usuario

Necesitamos que cada usuario pueda abrir varias sesiones simultáneas, ya sea como pestañas nuevas o nuevas, dependiendo de su elección de navegador. En este momento, cuando un usuario abre una pestaña o ventana de adición y va al sitio, se adopta la sesión existente. ¿Cómo puedo evitar esto para que el usuario deba (o pueda) iniciar sesión y comenzar una nueva sesión, sin que interfiera con ninguna sesión existente que ya tenga abierta?

Nuestra solución temporal consiste en utilizar varios navegadores (IE y FF), pero obviamente no es una forma muy deseable de hacer las cosas.

+0

No es posible que usted necesita para escribir su propio guión manejo de sesión y pase si a través de un anexo a cada URL –

+2

'pase si a través de un anexo a cada URL' ¿Qué podría salir mal? –

Respuesta

8

El comportamiento que describes se opone al concepto de una sesión del navegador. ¿Por qué un usuario querría más de una sesión? ¿Es una cuestión de controles de acceso del usuario que deben aplicarse? De ser así, asigne usuarios a grupos lógicos y otorgue permisos a grupos específicos. ¿Los usuarios deben realizar alguna acción en nombre de otros usuarios? Si es así, diseñe el sitio web alrededor de ese concepto en lugar de tratar de crear múltiples sesiones para un solo usuario.

Si realmente tiene que hacer esto, se podía hacer algo horrible como pase a lo largo de un parámetro de consulta (muy inseguro!) entre las páginas para actuar como un identificador de sesión, sin pasar por el real $ _SESSION por completo y la gestión de su propio concepto de una sesión. Nuevamente, esto no es normal y solo generará dolores de cabeza/problemas de seguridad en el futuro.

+1

La razón por la que tenemos esta necesidad se debe a la forma en que se usa la aplicación. p.ej. Una persona de ventas puede necesitar tener abierta más de una pantalla de entrada de pedidos en cualquier momento. Esto podría deberse a que un cliente debe ser entregado temporalmente a otro miembro del personal por varias razones.El vendedor debe poder comenzar un nuevo pedido para la siguiente persona en la fila, sin que interfiera con el pedido que ya está abierto, que finalizará cuando se devuelva el cliente original. Con el sistema anterior, esto se hizo abriendo varias copias de la aplicación (no basadas en la web). –

+10

Ah, lo entiendo ahora. :) Podría cambiar la forma en que funciona su sitio para no mantener el orden actual del vendedor en la sesión. En su lugar, podría utilizar un enfoque más RESTful [http://www.xml.com/pub/a/2004/08/11/rest.html], donde el ID del pedido que el vendedor está actualizando es parte de la web URL de la página De esta forma, podrían abrir dos pestañas/ventanas y modificar dos órdenes, y la sesión se eliminaría por completo de la imagen. – Dave

+1

Respuesta aceptada para el comentario anterior, en lugar de la respuesta en sí. –

1

Esto sería muy difícil de hacer, si es posible.

sesiones no deberían tener que preocuparse de qué pestaña que se encuentran.

Además, ¿qué ocurre si la sesión 1 en la lengüeta 1 se abre una nueva ventana? ¿Es una nueva sesión?

+0

Este es el mejor informe que pude encontrar al respecto: http://www.php.net/manual/en/ ref.session.php # 74557 –

+0

@onteria_ esto parece preparado para el abuso: 'Entonces, cada enlace, formulario, encabezado() y código JavaScript reenviará el valor de SESSION_NAME al próximo script y sabrá cuál es la sesión que debe usar .' –

2

no atómica de administración de sesiones concurrentes de acceso puede ser simulado con la siguiente lógica de pseudo código:

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(){} 
} 
} 
-2

Aquí es una manera de hacerlo:

-Primeras desactivar las cookies de sesión en php.ini con :

session.use_cookies = 0 

Esto garantiza que las cookies no se utilicen para pasar la identificación de la sesión.

-entonces Asegúrese de que usted genera todas sus URL con el id de sesión incluido (se obtiene a través de la función session_id() por ejemplo:.

print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";