Foros del Web » Programando para Internet » PHP »

No envía la cookie de sesion

Estas en el tema de No envía la cookie de sesion en el foro de PHP en Foros del Web. Hola: Ni en local ni en hosting, un script sencillo como este: Código PHP: <?php session_start (); echo  "He iniciado una sesion" ; ?> envía la cookie al ...
  #1 (permalink)  
Antiguo 01/01/2006, 04:58
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 7 meses
Puntos: 0
No envía la cookie de sesion

Hola:

Ni en local ni en hosting, un script sencillo como este:
Código PHP:
<?php
session_start
();
echo 
"He iniciado una sesion";
?>
envía la cookie al cliente. En el navegador no sale ningún aviso, pero en un editor de PHP, Debug marca
Warning:session_start():Cannot send session cookie - headers already sent in........ on line 2 (la línea en que está session_start)
Warning:session_start():Cannot send session cache limiter - etc....

No hay salidas html, javascrit, líneas ni espacios en blanco antes de session_start();

Y realmente, la cookie no se envía. Como la aplicación parece funcionar bien tanto en local como en hosting, no he visto este error hasta que busqué las cookies y no las encontré.

He probado de enviar cookies distintas a la que se debería enviar con session_start(); y las envía y se almacenan bien. He buscado las cookies en el Pc para ver si estaban en algún otro directorio y no las he encontrado (Lo he hecho para asegurarme de que el Debug del editor funciona bien). También he desactivado los firewalls, pero todo sigue igual.

Y la verdad, no sé por donde seguir.

El php.ini está asi:

session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid On On

La única diferencia entre el php.ini local y el del servidor es que en éste register_globals está activado.

La verdad es que esto me desconcierta bastante, ya que como digo, la web parece funcionar bien. (imagino que debe propagarse el SID por URL automáticamente).

Pero no entiendo el problema ni mucho menos la causa.

Agradecería mucho vuestra ayuda, ya que lo que realmente quiero es propagar el SID por cookie.

Muchas gracias.
  #2 (permalink)  
Antiguo 02/01/2006, 05:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Warning:session_start():Cannot send session cookie - headers already sent in........ on line 2 (la línea en que está session_start)
Debes indicar el mensaje de error -exacto- que ahí obtienes y el código que usas en el script mencionado.

Fijate bien por qué en esos ..... que eliminastes el mensaje de error (script) ahí es donde se informa -quien- está dando el problema .. no se refiere a "cookies" sino a "cabeceras HTTP" exactamente (que son enviadas por una cookie, es cierto ..).

El caso es que antes de un session_Start() no puede existir antes de su <? algún espacio .. o salto de línea .. o HTML o algún echo "algo" .. o javascript .. o salida en general al navegador.

Un saludo,
  #3 (permalink)  
Antiguo 02/01/2006, 09:46
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 7 meses
Puntos: 0
Gracias por tu respuesta.

Estoy seguro de que todo funciona y está bien y que lo que pasa es que me falta aclarar algún concepto. ¿Me ayudas?

1.- El cliente, ¿recibe siempre una cookie (si tiene habilitada la aceptación de cookies) con el sid cuando entra en una página que empieza con <?php session_start();?> y que no envía cabeceras ni nada antes?.

O por el contrario, desde la página habría que enviar la cookie con sus parámetros (nombre, valor, duración).

2.- ¿Puede ver el usuario desde el cliente esta cookie enviada con session_start(); y sin parámetros?. ¿Dónde se guarda, dónde está?.

Estas dos preguntas, seguramente tan tontas, las hago porque he entrado en páginas de manuales de sesiones y en mi ordenador no he podido localizar ninguna cookie con el sid de la sesion ni nada por el estilo.

Esto me hace pensar que servidor puede que no mande la cookie si es posible propagar la sesion de forma automática (creo que esto sería con session.use_trans_sid On On), o que el tema de las cookies de sesion sea diferente al de una cookie normal.

En fin, que no tengo las ideas claras. Lo que sí se es que el script que he puesto de ejemplo lo he ejecutado tanto en local como en hosting y en ningún caso he encontrado ninguna cookie. Lo del Debug del editor me hace dudar, pues no me fío mucho.

Gracias de nuevo y a ver si me aclaro.

AMPLIACION

No sé si www.forosdel web.com se inicia con session_start(); (imagino que sí), pero yo recibo en mi ordenador dos cookies y en ninguna de ellas ([email protected][1] y [email protected][1]). Y en ninguna de ellas identifico un SID.

Última edición por javifo; 02/01/2006 a las 10:03
  #4 (permalink)  
Antiguo 02/01/2006, 11:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
1.- El cliente, ¿recibe siempre una cookie (si tiene habilitada la aceptación de cookies) con el sid cuando entra en una página que empieza con <?php session_start();?> y que no envía cabeceras ni nada antes?.
El uso de sesiones de PHP envia varías cabeceras al cliente, no sólo la cookie. Hay una más que define si la página generada quedará en caché o no o de que tipo será (privada, pública ..). Lo define la directiva

session.cache_limiter

Y por defecto envia "nocache".

Así que esa siempre se envia .. y luego si propagas el SID en cookies (expresamente indicado en session.use_cookies a ON y/o sessoin.use_only_cookies)

Cita:
O por el contrario, desde la página habría que enviar la cookie con sus parámetros (nombre, valor, duración).
Ya lo hace PHP por tí si decides propagar el SID en cookies.

Cita:
2.- ¿Puede ver el usuario desde el cliente esta cookie enviada con session_start(); y sin parámetros?. ¿Dónde se guarda, dónde está?.
Si el tiempo de duración de la cookie es "0" (segundos) son cookies de "sesión" .. Estas cookies no quedan como "archivos" en el navegador. Esto es una propiedad de las cookies de ese tipo (parece que quedan en memoria hasta que cierras la última ventana del sitio que creó esa cookie).

Cita:
Esto me hace pensar que servidor puede que no mande la cookie si es posible propagar la sesion de forma automática (creo que esto sería con session.use_trans_sid On On), o que el tema de las cookies de sesion sea diferente al de una cookie normal.
Si, .. si la cookie no se puede crear y usa session.use_trans_sid a ON .. se re-escribiran ciertos tag's HTML para insertar el SID en ellos .. pero en ese caso si ves tus links generados .. el URL o el código HTML de esas páginas por algún sitio veras el SID (nombre sesion=Identificador sesion) como parte de link's, en un campo hidden en un formulario .. etc.


Un saludo,
  #5 (permalink)  
Antiguo 02/01/2006, 13:16
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 7 meses
Puntos: 0
Creo que ya sé mucho más de sesiones.

¡Una respuesta perfecta!

Aclaradas las dudas que, como me temía, eran de concepto.

1.- session.cache_limiter siempre se envía aunque no se indique. Mi hosting envía, efectivamente, 'nocache' (en local tengo lo mismo). Al igual que session_name() -opcional- se envía antes que nada.
¡Lección: No hacer caso en esto del Debug del editor, o buscar un editor mejor!

2.- El cliente siempre recibe una cookie a no ser que no las admita. Pero no quedan en archivos porque su duración es de 1 segundo (Esto creo que debe definirlo session_cookie_lifetime - en mi caso 0 -). De todas formas, quedan en memoria mientras dura la sesion.
¡Esto me ha hecho romper la cabeza!. Pero al fin lo entiendo: Las cookies de sesion son 'especiales', o mejor dicho, las hace especiales la directiva que define su duración. Imposible encontrarlas si no tienen duración. (Ya he probado modificando la directiva y por fin las encuentro).

3.- Con session.use_trans_sid a ON el SID se propaga aunque el cliente no admita cookies. La seguridad es menor, pero la página siempre funciona.

Si estoy en lo cierto, una configuración así del php.ini:

session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid On On
session_cookie_lifetime 0 0

es adecuada y 'garantiza' (dentro de lo posible) el funcionamiento de las sesiones.

Muchas gracias por tu ayuda. De verdad que el tema me preocupaba. Veía que la página iba bien, pero no sabía el por qué. Y esta era una situación que no me gustaba nada.

¡Por fin aclarado!
  #6 (permalink)  
Antiguo 02/01/2006, 15:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
1 y 2) .. Ya que trabajas con el protocolo HTTP .. lo mejor es conseguirse un "snifffer" HTTP para ver TODO lo que transita entre cliente-servidor (desde tu navegador de pruebas hasta tus scripts PHP en el servidor y en sentido inverso). Eso te ayudará a "ver" cosas que nunca habrías visto y sin embargo sin primordiales para entender otros "conceptos" de este estilo.

3) Con session.use_trans_sid debes conocer también que tag's HTML se van a re-escribir . .concretamente son los que define: url_rewrite_tags y sólo esos. PHP bajo ningún concepto lo hará en redireccionamientos javascript (window.open .. location ...) ni en PHP bajo un header("location ....") ni en links en flash .. (y no recuerdo más situaciones ahora).

Es decir .. si la cookie no es aceptada o no se puede crear por algún tipo de rechazo, .. la directiva session.use_trans_sid On On actuará y PHP re-rescribirá los tag's HTML que ahí se indiquen ... pero no lo hará en los casos expuestos .. así que tu aplicación si usa alguno de esos redireccionamientos (lo cual es muyyyyyy común) se podría comportar de forma inestable .. es decir, algunas cosas "te irian" las sesiones y en otros ocasiones perderías "por el camino" tus sesiones. En esos casos tendrías que propagar el SID manualmente para evitar este problema .. y .. llegado este caso: o controlas si puedes crear cookies en el cliente u propagas el SID en cookies -siempre- o propaga siempre (y manualmente) el SID en el URL (para no depender también de session.use_trans_sid)

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:05.