variable type por pasar pagina funcion enviar ejemplos ejecutar despues datos cargar carga asincrona antes php ajax session session-variables

type - ¿Por qué este script PHP(llamado por AJAX) al azar no carga SESSION correctamente?



enviar datos por ajax (3)

Ahoy StackOverflow,

Me he encontrado con este problema en mi proyecto: en resumen, por lo que he reunido, es que el script PHP llamado a través de AJAX no registra correctamente las variables de SESSION que se establecieron en la parte superior de la página index.php . Al principio, supuse que se debía al bloqueo de sesión, así que seguí y agregué session_write_close() , sin embargo, eso no solucionó el problema.

Este problema solo ocurre aproximadamente el 25% por ciento del tiempo después de que comienza una nueva sesión de usuario (es decir, cuando un usuario inicia sesión).

Seguí adelante y borré el 90% del código para obtener el error hasta su mínima codificación necesaria para reproducir.

Mal resultado de Firebug a través de ajax.php

Resultado esperado de Firebug a través de ajax.php

Nota: Ambos resultados muestran el retorno del print_r($_SESSION) del índice print_r($_SESSION) como Array ( [userid] => 3724 [trialstatus] => 1 [trialtcompletions] => 0 [userlevel] => 5 ) que me permite saber el problema. t con la sesión configurada en la página de índice.

¿Alguien sabe una solución (quizás ni siquiera en cuanto a código, tal vez incluso una configuración de servidor) que permitirá que la secuencia de comandos llamada a través de AJAX acceda correctamente a la variable de sesión?

Escenario de prueba para la reproducción

  1. Eliminar todas las cookies para el dominio
  2. Cargar página (máx. 2 veces). El problema nunca ocurre después de 2 recargas.
  3. Si no se muestra el resultado incorrecto, repita los pasos.

index.php

<?php if (session_status() === PHP_SESSION_NONE) session_start(); if (!isset($_SESSION[''userid''])) { $_SESSION[''userid''] = 3724; //$login[''AccountID'']; } $_SESSION[''trialstatus''] = "12"; $_SESSION[''trialtcompletions''] = "12"; $_SESSION[''userlevel''] = "12"; session_write_close(); print_r($_SESSION); ?> <!DOCTYPE html><html><head><script src="./js/jquery.min.js"></script> <script> function loadStage(step,input,callback){ $.ajax({ type: "POST", url: "./ajax.php", data: { step: step, input: input }, dataType: "JSON", timeout: 5000, success: function(data){ if(data !== false){ callback(data); } } }); } $(document).ready(function(){ startLoadingSequence(); }); function startLoadingSequence(skipped){ loadStage(1,skipped,function(data){}); } </script> </head></html>

ajax.php

<?php if (session_status() === PHP_SESSION_NONE) session_start(); print_r($_SESSION); if (!isset($_SESSION[''userid''])) { die(json_encode(array( "error", "You must be logged in to view report data." ))); } ?>

Por solicitud:

Leer comentarios para obtener información adicional


Dos cosas pueden causar este problema.

  1. No tiene suficiente espacio en la ruta de grabación de la sesión (df -h) o su servidor no tiene permiso para guardarlo.
  2. Su servidor está detrás de un equilibrador de carga y debe guardar sesiones en un servidor persistente como Memcache o redis.

La captura de pantalla que adjunté es la misma para casi todas las 25-30 ejecuciones que he ejecutado. [1]: http://i.stack.imgur.com/MgLpS.jpg Comprueba el tamaño de datos de tu sesión, tal vez excede el tamaño de la caché. o alguna otra información de sesión se está almacenando agotando su memoria caché. Aumente el tamaño de su caché tal vez sea útil para su situación.


Si está ejecutando un equilibrador de carga, debe asegurarse de que sus servidores estén llegando a un punto común para los datos. Por defecto, PHP almacena sesiones en el sistema de archivos local. Eso se convierte en un problema si su equilibrador de carga lo envía del servidor A al servidor B, donde ese archivo no existe. Puede configurar un recurso compartido de red y asegurarse de que todos los servidores web usen ese recurso compartido. Para poder crear un recurso compartido NFS y luego agregar session_save_path o configurarlo dentro de php.ini

session_save_path(''/your/nfs/share/here'');

Otra opción es escribir su propio controlador de sesión que coloque sesiones en su base de datos. A continuación, puede utilizar algo como memcached para almacenar las sesiones de una manera que no martilleará su base de datos cada vez que lea los datos de su sesión.