2008-10-04 10 views
7

Tengo una API que depende de cierta información de estado entre las solicitudes. Como una primera versión fácil del código, simplemente estoy usando las sesiones de PHP para almacenar la información de estado en lugar de algo más avanzado (APC, Memcache, DB). Durante mi prueba inicial en un navegador web, todo funcionó perfectamente. Sin embargo, parece que cuando los clientes intentan conectarse a través de métodos que no son del navegador, como Curl o wget, la información de estado no se conserva.En PHP se creará una sesión si no se utiliza un navegador

¿Se creará una sesión PHP solo si un navegador está solicitando la página? Estoy comenzando explícitamente la sesión con session_start() y nombrándola de antemano con session_name().

Una nota adicional. Aprendí que uno de los principales problemas que tenía era que estaba nombrando la sesión en lugar de establecer la identificación de la sesión a través de session_id ($ id); Mi intención al usar session_name() era recuperar la misma sesión que se creó previamente, y la forma correcta de hacerlo es establecer el session_id no el session_name.

Parece que la información de sesión se mantendrá en el servidor como se indica a continuación (GRACIAS). Pero para mantener esto, debe pasar la identificación de la sesión o, como en mi caso, cualquier otra identificación que identifique de manera única al usuario. Use esta identificación como session_id y sus sesiones funcionarán como se espera.

Respuesta

20

cookies de sesión

Recuerde que HTTP es sin estado, por lo que las sesiones se realiza un seguimiento en el servidor, pero el clientetiene que identificarse con cada solicitud. Cuando declara session_start(), , su navegador generalmente establece una cookie (el "Id. De sesión PHP") y luego se identifica enviando el valor de la cookie con cada solicitud. Cuando se invoca una secuencia de comandos utilizando una solicitud con un valor de sesión, la función session_start() intentará buscar la sesión. Para demostrarte esto, fíjate que las sesiones mueren cuando borras tus cookies. Muchas morirán incluso tan pronto como salgas del navegador, si la cookie es una cookie "de sesión" (una temporal). Mencionó que está nombrando la sesión ... eche un vistazo a las cookies de su navegador y vea si puede encontrar una cookie con el mismo nombre.

Todo esto quiere decir que las cookies desempeñan un papel activo en sus sesiones, por lo que si el cliente no admite las cookies, entonces no puede hacer una sesión como lo hace actualmente. . al menos no para esos clientes alternativos. Se creará una sesión en el servidor; la pregunta es si el cliente está participando o no.

Si las cookies no son una opción para su cliente, tendrá que encontrar de otra manera para pasar una identificación de sesión al servidor. Esto se puede hacer en la cadena de consulta , por ejemplo, aunque se considera un poco menos privado enviar una identificación de sesión de esta manera.

mysite.com?PHPSESSID=10alksdjfq9e 

¿Cómo hacer para esto específicamente pueden variar con su versión de PHP, pero es básicamente una configuración. Si se establecen las opciones de tiempo de ejecución adecuadas, PHP agregará de forma transparente la identificación de la sesión como parámetro de consulta a los enlaces en la página (por ejemplo, de la misma fuente). Puede encontrar los detalles para configurarlo en el PHP website.

Sidenote: Hace años, este era un problema común al intentar implementar una sesión.Las cookies eran más recientes y muchas personas estaban desactivando el soporte de cookies en sus navegadores debido a supuestas preocupaciones de seguridad.

Nota al margen:@Uberfuzzy hace un buen uso de punto- sesiones con curl o wget es realmente posible. El problema es que es menos automático. Un usuario puede volcar valores de encabezado en un archivo y usar los valores en futuras solicitudes. curl tiene algunos indicadores de "reconocimiento de cookies", que le permiten manejar esto más fácilmente, pero aún debe hacerlo explícitamente. Por otra parte, podría usar esto para su ventaja. Si Curl está disponible en su cliente alternativo, entonces usted mismo puede hacer la llamada de manera plausible, utilizando las banderas de concientización de cookies. Consulte el curl manual.

+0

> pero si el cliente no soporta los cookies (como rizo o wget) en realidad. ambos admiten alguna forma de almacenar/cargar un archivo de cookie – Uberfuzzy

+0

Buena captura. Gracias. – keparo

2

Si llama a session_start(), se creará una sesión si el cliente no está en una existente. Si el cliente no admite (o está configurado para ignorar) las cookies o el mecanismo querystring utilizado para mantener la sesión, se creará una nueva sesión en cada solicitud.

Esto puede inflar el mecanismo de almacenamiento de la sesión con sesiones no utilizadas.

Podría ser una mejor idea llamar solo a session_start() cuando tenga algo que almacenar en la sesión (por ejemplo, inicio de sesión de usuario, o cualquier otra cosa que los robots no puedan hacer), si cree que esto es probable ser un problema

2

¿Se creará una sesión PHP solo si un navegador está solicitando la página?

Respuesta corta: Sí. Las sesiones se crearon específicamente para resolver el problema de estado sin estado HTTP al aprovechar las características del navegador. APC, memcached, DB, etc. no importan. Esos son solo métodos de almacenamiento para la sesión y sufrirán el mismo problema.

Respuesta más larga: El concepto de sesiones se creó para tener en cuenta el hecho de que HTTP es un protocolo sin estado, y resulta que ese estado es bastante importante para una amplia variedad de aplicaciones de software.

La forma más común de implementar sesiones es con las cookies. PHP envía el ID de la sesión en una cookie, y el navegador envía la cookie con la ID de la sesión nuevamente. Esta identificación se usa en el servidor para encontrar la información que haya almacenado en la sesión. PHP tiene la capacidad de incluir y leer una ID de sesión al final de una URL, pero, esto supone que los usuarios navegarán por las páginas de su sitio/aplicación haciendo clic en enlaces que incluyen una ID de sesión generada.

En su caso específico, es posible usar cookies con curl (y posiblemente wget). Curl es un navegador web, solo uno sin una GUI. Si es el programa de línea de comandos rizo que está utilizando (en contraposición a la biblioteca C, extensión PHP, etc.) Leer en las siguientes opciones

-b/--cookie 
-c/--cookie-jar 
-j/--junk-session-cookies 
Cuestiones relacionadas