tipos - AJAX, Sesiones PHP y solicitudes simultáneas
tipos de sesiones en php (8)
¡Voy directo al grano!
Mi javascript envía alrededor de 20 solicitudes AJAX a mi archivo PHP para responder (a través de una API web externa) cuando el usuario envía su búsqueda. Los resultados se almacenan en una matriz en la matriz de sesiones.
He leído que los navegadores solo permitirán 2 solicitudes simultáneas a un servidor.
Mi primer problema es que, aunque aún hay más de una solicitud esperando una respuesta, la solicitud de "agregar a la cesta" de AJAX no funcionará, ya que aún está esperando que se completen las demás solicitudes.
Mi segundo (y más molesto) problema es que las 2 solicitudes que se están manejando simultáneamente parecen estar sobre escribiendo entre sí, de modo que cuando todas las respuestas están completas, solo la mitad están en la matriz de sesiones. O bien todos los impares o incluso dependiendo de si la solicitud final es impar o par.
Preferiría no tener que enviar solicitudes de forma individual (es decir, solo enviar el siguiente cuando el último haya terminado), ya que eso reduciría un poco las cosas para el usuario.
¿Hay alguna solución a la sobreescritura de esta sesión o debería usar un enfoque completamente diferente?
¡Gracias a todos!
Editar:Es para verificar la disponibilidad del dominio. El usuario busca "mydomain" y finalmente se presentan los resultados para com, net, org, etc.
Enviar una única solicitud y tener la búsqueda de scripts para todos los tld de una vez significa que no se devuelve una respuesta hasta que todos los resultados estén disponibles. El resultado de algunos tlds parece tardar más de 30 segundos durante los cuales el usuario no recibe ningún comentario guardar para un icono swirly y "Please Wait" (esto es lo que sucede cuando javascript no está habilitado).
Las solicitudes separadas me permiten mostrar la disponibilidad de dominios a medida que entran.
Actualmente estoy pensando en enviar una sola solicitud y luego usar el valor de setinterval de javascript para verificar la sesión repetidamente hasta que todos los resultados estén disponibles.
Como otros han señalado, su primer enfoque debería ser reducir el número de solicitudes. Si no es una opción, puede usar subdominios para aumentar el número de solicitudes paralelas.
Configure su DNS (por ejemplo, mydomain.com) para aceptar todos los subdominios * .midominio.com y para enviarlos al mismo servidor.
A continuación, puede enviar las diferentes solicitudes de AJAX a diferentes dominios (a.midominio.com, b.midominio.com, ...)
Este enfoque es utilizado por los servidores de mapas, como google maps, para aumentar el número de maptiles que el navegador descarga en paralelo.
Creo que deberías comenzar a refacturar tu solución:
- Todas las pautas de rendimiento indican que debe minimizar el número de solicitudes HTTP. 20 es demasiado
- Si tiene un recurso compartido, debe bloquear y desbloquear las partes que manipula para evitar que dos o más solicitudes lo actualicen al mismo tiempo.
Intente crear una petición COLA para sus llamadas ajax. Cada llamada se realizará después de que finalice la anterior.
Después de realizar la segunda solicitud, no puede estar seguro de lo que sucederá ya que, como dijo, solo se pueden enviar 2 solicitudes simultáneas. Después de ese número, la 3ª Solicitud probablemente sustituirá a la 2ª, etc.
Las solicitudes se procesan en paralelo, lo que significa que es similar a la programación concurrente (con subprocesos), incluidas las condiciones de carrera, etc.
Mi sugerencia sería simplemente enviar la acción de búsqueda (suponiendo que el usuario realice solo una búsqueda, y no 20) al servidor, y dividirla allí sobre las 20 acciones que desea que realice. Eso le permite ejecutarlos en secuencia, evitando que se sobrescriban entre sí.
Lo siento, no es realmente la respuesta que buscas, pero 20 solicitudes suenan demasiado para una sola búsqueda. Habiendo implementado algo similar, es decir. un breve historial de búsqueda almacenado en la sesión, optamos por no utilizar AJAX en absoluto. Hay un momento y un lugar para ello, pero no si va a matar a su servidor con solicitudes cuando aumenta el tráfico.
Supongo que este es un tipo de cuadro de búsqueda de autocompletar. Si está utilizando Scriptaulous ''Ajax.Autocompleter, puede simplemente especificar un parámetro "minChars". No enviará la solicitud AJAX hasta que al menos se hayan ingresado tantos caracteres.
También puede ajustar el parámetro ''frecuencia'', que cambia la frecuencia (en segundos) en que debe sondearse el campo de entrada para los cambios antes de activar una solicitud AJAX.
http://php.net/manual/en/function.session-write-close.php
Almacene los datos de su sesión en variables locales, luego llame a esta función para desbloquear su sesión para otros archivos. (aunque hay que decir que 20 llamadas AJAX probablemente no sean la mejor solución)
El problema es que entre una solicitud simultánea, la sesión se inicia. incluso cuando está abierto en otro contexto, debido a la lectura de la sesión almacenada, y la misma cookie, la sesión abierta por cada solicitud es la misma. Entonces, si una de las solicitudes actuales finaliza primero su tarea, cerrará la sesión como ocurre siempre que un script haya terminado su tarea, pero dado que el otro script (el otro llamado) aún puede estar ejecutándose, no está consciente de que la sesión ya se ha cerrado, por lo que hay algunas soluciones para esto. Antes de finalizar la tarea, copie la sesión var en un titular de sesión var, reinicie la sesión, restaure los valores de session session = sessionholder y session_write_close ¿Qué sesión comenzará o finalizará primero? a veces no hay forma de saberlo, tal vez el primero que comenzó la sesión tardará más en terminar su tarea, mientras que el otro viene y va, de todos modos, tómenlo como está, la sesión no es más que guardar una variable llamada sesión, escriba array con valores clave, el tratamiento de recuperar los valores almacenados, luego actualizar el guardado de esos valores al final de la tarea de script es lo que hace que la sesión sea automática en este asunto, por lo que no hay diferencia si inicia una sesión (recupera su almacenamiento valores, asigne nuevos valores a la misma, luego guárdelos de nuevo, el proceso es iniciar sesión, asignar valores, cerrar sesión de escritura. Por supuesto, tenga en cuenta que si reinicia una sesión sin mantener sus valores reales, se perderán (se sobrescribirá si existen) por lo que primero debe mantener sus valores reales, restaurar, reasignar los valores actuales, luego writeclose. El otro proceso inherente a esa variable de sesión específica que hace php, es asignar una referencia (ID de sesión) que envía al cliente (generalmente a través de cookie) así que cuando la cookie está de vuelta con esa ID de referencia identifica la variable de sesión almacenada para recuperar los valores anteriores. Recuerde que una misma llamada puede hacer lo mismo, ya que ajax es asincrónico, si por alguna razón una llamada se está retrasando y los usuarios vuelven a hacer clic, la nueva solicitud no terminará y se producirá el mismo problema, por lo que si se utiliza ajax se prepara para manejar sesiones según sea necesario según su aplicación. Y finalmente, recuerde que la llamada a puede ser a un archivo diferente, o el mismo archivo, una solicitud de llamada ajax precios.php el otro products.php pero ambos usarán la misma variable almacenada de sesión, la sesión var es solo una para todos los tiempos todos los scripts que tienes Avenida Gez. Gracias por leer