2008-10-01 14 views
55

Tengo una de esas situaciones de "Juro que no toqué el servidor". Honestamente, no toqué ninguno de los scripts php. El problema que estoy teniendo es que los datos php no se guardan en diferentes páginas o actualizaciones de página. Sé que se está creando una nueva sesión correctamente porque puedo establecer una variable de sesión (por ejemplo, $ _SESSION ['foo'] = "foo" e imprimirla de nuevo en la misma página, pero cuando intento usar esa misma variable) en otra página no está configurado! ¿Hay alguna función php o información que pueda usar en mi servidor de hosts para ver qué está pasando?Datos de sesión PHP no guardados

Aquí hay un script de ejemplo que no funciona en el servidor de mis hosts como de la derecha ahora:

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
    $_SESSION['views'] = $_SESSION['views']+ 1; 
else 
    $_SESSION['views'] = 1; 

echo "views = ". $_SESSION['views']; 
echo '<p><a href="page1.php">Refresh</a></p>'; 
?> 

La variable 'vistas' nunca se incrementa después de hacer una actualización de la página estoy pensando que esto es un problema de su lado, pero quería asegurarse de que yo no soy un completo idiota primero..

Aquí es el phpinfo() para el servidor de mis anfitriones (PHP versión 4.4.7): alt text

+0

Intente reemplazar su línea echo '

Refresh

'; con header ('Ubicación: http: //'.$_SERVER [' HTTP_HOST '] .'page1.php'); –

Respuesta

41

Gracias por toda la información útil. Resultó que mi host cambió los servidores y comenzó a utilizar una ruta de guardado de sesiones diferente a/var/php_sessions que ya no existía. Una solución hubiera sido declarar ini_set(' session.save_path','SOME WRITABLE PATH'); en todos mis archivos de script, pero eso hubiera sido un problema. Hablé con el host y establecieron explícitamente la ruta de la sesión a una ruta real que sí existía. Espero que esto ayude a cualquiera que tenga problemas en el camino de la sesión.

+1

¿Podría dar un ejemplo de la línea de código? – Steeven

+0

¡Muchas gracias! Funciona como encanto! – raBne

7

Uso phpinfo() y comprobar los ajustes session.*.

Tal vez la información se almacena en las cookies y su navegador no acepta cookies, algo así.

Compruebe eso primero y vuelva con los resultados.

También se puede hacer un print_r($_SESSION); tener un vertedero de esta variable y ver el contenido ....

En cuanto a su phpinfo(), es el session.save_path válida? ¿Su servidor web tiene acceso de escritura a este directorio?

Espero que esto ayude.

+0

¡Gracias! Mi problema era que las cookies no se almacenaban correctamente, provocaba la pérdida de todas las variables de sesión entre las páginas. ¡Fijo! – tozhan

2

Compruebe el valor de "vistas" cuando antes de incrementarlo. Si, por alguna extraña razón, se está haciendo establece en una cadena, entonces cuando se agrega 1 a la misma, siempre volverá 1.

if (isset($_SESSION['views'])) { 
    if (!is_numeric($_SESSION['views'])) { 
     echo "CRAP!"; 
    } 
    ++$_SESSION['views']; 
} else { 
    $_SESSION['views'] = 1; 
} 
5

Compruebe si la sesión de ruta donde se guardan es escribible por el servidor web .

Asegúrate de que tienes activadas las cookies .. (no recuerdo cuando les apago para probar algo)

uso Firefox con la extensión Firebug para ver si la cookie se establece y se transmite de vuelta.

Y en una nota no relacionada, comience a buscar en php5, porque php 4.4.9 es el último de la serie php4.

2

Bueno, podemos eliminar el error de código porque probé el código en mi propio servidor (PHP 5).

Esto es lo que para comprobar si hay:

  1. son usted que llama session_unset() o session_destroy() en cualquier lugar? Estas funciones eliminarán los datos de la sesión inmediatamente. Si pongo estos al final de mi script, comienza a comportarse exactamente como usted describe.

  2. ¿Actúa igual en todos los navegadores?Si funciona en un navegador y no en otro, es posible que tenga un problema de configuración en el navegador que no funciona (es decir, que desactivó las cookies y olvidó activarlas, o está bloqueando las cookies por error).

  3. ¿Se puede escribir en la carpeta de sesión? No puede probar esto con is_writable(), por lo que deberá ir a la carpeta (desde phpinfo() se ve como/var/php_sessions) y asegurarse de que las sesiones realmente se están creando.

1

sé una solución que encontré (OSX con Apache 1 y acaba de cambiar a PHP5) cuando tenía un problema similar fue que desarmar 1 clave específica (es decir, unset ($ _ SESSION [ 'clave']);) estaba causando que no se guarde. Tan pronto como no desarmé esa clave, ella guardó. Nunca he visto esto otra vez, excepto en ese servidor en otro sitio, pero luego era una variable diferente. Tampoco hubo nada especial.

1

Aquí hay un problema común que no he visto abordado en los otros comentarios: ¿está ejecutando su host un caché de algún tipo? Si almacenan los resultados de la memoria caché automáticamente, obtendrías este tipo de comportamiento.

1

Solo quería agregar una pequeña nota de que esto también puede ocurrir si accidentalmente pierde la declaración session_start() en sus páginas.

2

sé una solución que encontré (OSX con Apache 1 y acaba de cambiar a PHP5) cuando tenía un problema similar fue que desarmar 1 clave específica (es decir, unset ($ _ SESSION [ 'clave']);) era causando que no se guarde Tan pronto como no desarmé esa clave, ella guardó. Nunca he visto esto otra vez, excepto en ese servidor en otro sitio, pero luego era una variable diferente. Tampoco hubo nada especial.

Gracias por este Darryl. Esto me ayudó. Estaba borrando una variable de sesión y, por alguna razón, impedía que la sesión se confirmara. ahora solo lo estoy configurando para nulo (lo cual está bien para mi aplicación), y funciona.

0

Compruebe si está utilizando session_write_close(); en cualquier lugar, estaba usando esto justo después de otra sesión y luego intenté escribir en la sesión otra vez y no estaba funcionando ... así que simplemente comenten eso sh * t

2

Si establece una sesión en php5, intente léelo en una página php4, ¡podría no mirar en el lugar correcto! Haga que las páginas tengan la misma versión php o establezca session_path.

3

Compruebe quién es el grupo y el propietario de la carpeta donde se ejecuta la secuencia de comandos. Si la identificación del grupo o la identificación del usuario son incorrectas, por ejemplo, establecer como raíz, las sesiones no se guardarán correctamente.

8

Tuve el mismo problema: lo que me sucedió es que nuestro administrador del servidor cambió el session.cookie_secure booleano a On, lo que significa que las cookies solo se enviarán a través de una conexión segura. Como no se encontraba la cookie, php estaba creando una nueva sesión cada vez, por lo que las variables de sesión no se veían.

+1

Este fue mi problema, y ​​configuré session.cookie_secure yo mismo - ¡duh! Lo extraño es que siguió trabajando en el entorno inseguro durante unas 2 semanas antes de detenerse de repente, por lo tanto, no pensé conectar los dos. –

2

Pasé siglos buscando la respuesta para un problema similar. No fue un problema con el código o la configuración, ya que un código muy similar funcionaba perfectamente en otro .php en el mismo servidor. Resultó que el problema fue causado por una gran cantidad de datos que se guardan en la sesión en esta página.En un lugar teníamos una línea como esta: $_SESSION['full_list'] = $full_list donde $full_list era una matriz de datos cargados desde la base de datos; cada fila era una matriz de alrededor de 150 elementos. Cuando el código se escribió inicialmente hace un par de años, el DB solo contenía alrededor de 1000 filas, por lo que el $full_list contenía alrededor de 100 elementos, cada uno de los cuales era una matriz de aproximadamente 20 elementos. Con el tiempo, los 20 elementos se convirtieron en 150 y 1000 filas convertidas en 17000, por lo que el código almacenaba cerca de 64 megas de datos en la sesión. Aparentemente, con esta cantidad de datos almacenados, se negó a almacenar nada más. Una vez que cambiamos el código para tratar los datos localmente sin guardarlo en la sesión, todo funcionó perfectamente.

1

Tenía la ruta de la cookie de sesión establecida en "//" en lugar de "/". Firebug es increíble. Espero que ayude a alguien.

6

Había siguiente problema

index.php

<? 
    session_start(); 
    $_SESSION['a'] = 123; 
    header('location:index2.php'); 
?> 

index2.php

<? 
    session_start(); 
    echo $_SESSION['a']; 
?> 

La variable $_SESSION['a'] no se estableció correctamente. Entonces he cambiado el index.php acordingly

<? 
    session_start(); 
    $_SESSION['a'] = 123; 
    session_write_close(); 
    header('location:index2.php'); 
?> 

No sé lo que esto significa internamente, sólo explico a mí mismo que el cambio de variable de sesión no fue lo suficientemente rápido :)

+0

El/un problema con esto, es que su encabezado no se redirigirá debido a la falta de espacio entre 'location' y' index2.php' 'header ('location: index2.php');' <= no funcionará, pero this will => 'header ('location: index2.php');' –

+0

¡esto funcionó para mí! me gustaría saber por qué tho:/ – deacs

11

Compruebe para asegurarse de que no está mezclando https: // con http: //. Las variables de sesión no fluyen entre sesiones seguras e inseguras.

1

Tuve este problema al usar páginas seguras de donde venía de www.domain.com/auth.php que se redirigía a domain.com/destpage.php. Quité el www del enlace auth.php y funcionó. Esto me tiró porque todo funcionó de otra manera; la sesión no se estableció cuando llegué al destino.

1

Un problema común que a menudo se pasa por alto es también que NO debe haber ningún otro código o espaciado adicional antes del comando session_start().

He tenido este problema antes donde tenía una línea en blanco antes de session_start() que hizo que no funcionara correctamente.

1

Edite su php.ini.
creo que el valor de session.gc_probability es 1, por lo que la puso a 0.

session.gc_probability=0 
1

Adición de mi solución:

Comprobar si accede al dominio correcto . Estaba usando www.mysite.com para iniciar la sesión e intenté recibirlo desde mysite.com (sin el www).

He resuelto esto agregando una reescritura htaccess de todos los dominios a www para estar en el lado seguro/sitio.

También verifique si utiliza http o https.

+0

De hecho, utilizando https://example.net mi navegador no almacenó la cookie de sesión. Con https://www.example.net funcionó. Pero, ¿cómo es que el nombre de host puede hacer la diferencia? – xebeche

+0

Adivina que cada subdominio tiene su propia carpeta temporal para las sesiones. 'www' también cuenta como subdominio. –

+0

En mi caso, la aplicación siempre enviaba exactamente el mismo encabezado Set-Cookie w/'domain = www.example.net', pero Firefox silenciosamente (busqué 2h para una forma de registrar esto) descarté la cookie si se accedía al sitio como' ejemplo.net'. Cambiar la aplicación para que envíe 'domain = example.net' la solucionó. Por cierto, en el servidor esto fue causado por 'UseCanonicalName On' junto w /' ServerName www.example.net'. – xebeche

0

Otras cosas que tuve que hacer (tuve el mismo problema: no retención de sesson después de la actualización de PHP a 5.4). Muchos no los necesitan, dependiendo de cuál sea el php de su servidor.ini contiene (ver phpinfio());

session.use_trans_sid=0 ; Do not add session id to URI (osc does this) 
session.use_cookies=0; ; ensure cookies are not used 
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT 
session.save_path=~/tmp/osc; ; Set to same as admin setting 
session.auto_start = off; Tell PHP not to start sessions, osc code will do this 

Básicamente, su php.ini debe establecerse en ninguna cookie, y los parámetros de sesión debe ser coherente con lo que quiere osc.

También es posible que deba cambiar algunos fragmentos de código de sesión en application_top.php - crear objetos donde no exista ninguno en las llamadas tep_session_is_registered (...) (p. Ej., Objeto de navegación), establecer $ HTTP_ variables en el $ más nuevo _SERVER y algunas otras pruebas de isset para objetos vacíos (google para obtener información). Terminé siendo capaz de utilizar los archivos originales sessions.php (incluye/classes e includes/functions) con un application_top.php ligeramente modificado para que todo vuelva a funcionar. La configuración de php.ini fue el principal problema, pero esto, por supuesto, depende de lo que tu compañía de servidor haya instalado como predeterminada.

Cuestiones relacionadas