¿Accediendo a la sesión en la línea de comando de PHP?

Entiendo que la línea de comandos no es un servidor web, por lo que no puede acceder a $_SESSION . Pero no sé qué más hacer.

He estado siguiendo este tutorial para crear un chat usando websockets: http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

Mi problema es que no sé cómo obtener el nombre de usuario del remitente del mensaje de forma segura. Podría incluirlo en la función de envío de mensajes, pero como está en Javascript, todos pueden editar su nombre de usuario a otras personas.

¿Cómo podría obtener de forma segura el nombre de usuario del usuario, que es $_SESSION['username'] ?

 var Server; Server = new FancyWebSocket('ws://0.0.0.0:9000'); send( "test" ); 

Estoy abierto a todo tipo de sugerencias, como alternativas a websockets. Estoy creando un chat en tiempo real para mi sitio web.

La primera alternativa es, por supuesto, las solicitudes AJAX. AJAX no tiene el problema de no poder acceder rápida y fácilmente a las sesiones que tiene WebSockets. Cualquier frecuencia de muestreo suficientemente frecuente es indistinguible del tiempo real.

Ahora, para mi solución bastante larga implementada en WebSockets:

Los encabezados HTTP están disponibles para el servidor WebSocket durante el protocolo de enlace, incluidas las cookies. En el servidor que está utilizando, PHP-Websockets , los encabezados se almacenan en la propiedad $headers .

Por ejemplo:

 var_dump($user->headers); array(14) { ["get"]=> string(8) "/echobot" ["host"]=> string(14) "127.0.0.1:9000" ...snip... ["cookie"]=> string(100) "PHPSESSID=jan9uknpc06mk4ddghph4870t1; MyCookie=My+Value%21%40%23%24%25; MyNonhttponlyCookie=My+Value" } 

Estas cookies fueron generadas a partir de

 session_start(); $_SESSION['Hi!'] = array('Hello!', 'where' => 'world!'); setcookie('MyCookie', 'My Value;!@#$%', 0, '/', '127.0.0.1', false, true); setcookie('MyNonhttponlyCookie', 'My Value', 0, '/', '127.0.0.1', false, false); 

Por lo tanto, el valor de $user->headers['cookie'] es una colección delimitada de punto y coma ( ; ) de pares de valores clave, donde los valores están codificados en URL y separados de su clave con un signo igual. (PHP se queja si coloca caracteres reservados en el nombre de la cookie. Por lo tanto, la clave de la cookie no puede contener ningún valor codificado en la url).

Una forma rápida de extraer estos son los siguientes

 $cookies = array(); $cookiesParts = explode('; ', $user->headers['cookie']); foreach ($cookiesParts as $cookieParts) { $interimCookie = explode('=', $cookieParts); $cookies[$interimCookie[0]] = urldecode($interimCookie[1]); } var_dump($cookies); array(3) { ["PHPSESSID"]=> string(26) "jan9uknpc06mk4ddghph4870t1" ["MyCookie"]=> string(14) "My Value;!@#$%" ["MyNonhttponlyCookie"]=> string(8) "My Value" } 

Ahora tenemos la ID de la sesión. Verifique dos session_name() con session_name() , que le dará la clave de la cookie que contiene la ID de la sesión.

Podríamos serializar y deserializar el archivo de sesión tal como está almacenado en el servidor, al que apunta session_save_path() … pero quiero hacer trampa.

Debido a que el sistema de sesión integrado bloquea los archivos de la sesión, no podemos simplemente mantener el archivo de sesión abierto y vigilar constantemente los cambios, ni podemos bloquear el archivo nosotros mismos durante largos periodos de tiempo.

Sería ideal si pudiéramos usar los métodos mágicos __get() y __set() aquí de la misma manera que $_SESSION superglobal $_SESSION _SESSION (como $myUser->_session['key'] = 'value'; ) , pero PHP no permite tratar estos métodos como matrices. En cambio, tenemos que establecer un método más mundano.

 session_id); session_start(); $val = $_SESSION[$key]; session_write_close(); // very important! return $val; } public setSession($key, $value) { session_id($this->session_id); session_start(); $_SESSION[$key] = value; session_write_close(); // still very important! } } 

(Nota: también estoy apuntando mi solicitud de función a esta pregunta, para basar mi implementación eventual de análisis de cookies y manejo de sesiones aquí, de modo que pueda recordar mi investigación esta noche mientras trabajo).