Me gustaría extender el tiempo de espera de la sesión en php
Sé que es posible hacerlo modificando el archivo php.ini. Pero no tengo acceso a eso.
Entonces, ¿es posible hacerlo solo con código php?
Me gustaría extender el tiempo de espera de la sesión en php
Sé que es posible hacerlo modificando el archivo php.ini. Pero no tengo acceso a eso.
Entonces, ¿es posible hacerlo solo con código php?
Respuestas:
El tiempo de espera de la sesión es una noción que debe implementarse en el código si desea garantías estrictas; esa es la única forma en que puede estar absolutamente seguro de que ninguna sesión sobrevivirá después de X minutos de inactividad.
Si se acepta un poco este requisito y está bien si coloca un límite inferior en lugar de un límite estricto a la duración, puede hacerlo fácilmente y sin escribir una lógica personalizada.
Conveniencia en ambientes relajados: cómo y por qué
Si sus sesiones se implementan con cookies (que probablemente lo sean), y si los clientes no son maliciosos, puede establecer un límite superior en la duración de la sesión modificando ciertos parámetros. Si está utilizando el manejo de sesión predeterminado de PHP con cookies, la configuración
session.gc_maxlifetime
junto consession_set_cookie_params
debería funcionar para usted así:Esto funciona configurando el servidor para mantener los datos de la sesión durante al menos una hora de inactividad e instruyendo a sus clientes que deben "olvidar" su identificación de sesión después del mismo lapso de tiempo. Ambos pasos son necesarios para lograr el resultado esperado.
Si no le dice a los clientes que olviden su ID de sesión después de una hora (o si los clientes son maliciosos y eligen ignorar sus instrucciones), seguirán usando la misma ID de sesión y su duración efectiva no será determinista. Esto se debe a que las sesiones cuya vida útil ha expirado en el lado del servidor no se recolectan de forma inmediata, sino solo cuando se inicia la sesión GC .
El GC es un proceso potencialmente costoso, por lo que, por lo general, la probabilidad es bastante pequeña o incluso cero (un sitio web que recibe un gran número de visitas probablemente renunciará por completo al GC probabilístico y programará que ocurra en segundo plano cada X minutos). En ambos casos (suponiendo clientes que no cooperan), el límite inferior para la duración efectiva de la sesión será
session.gc_maxlifetime
, pero el límite superior será impredecible.Si no establece
session.gc_maxlifetime
el mismo intervalo de tiempo, el servidor puede descartar los datos de la sesión inactiva antes de eso; en este caso, un cliente que todavía recuerda su ID de sesión lo presentará pero el servidor no encontrará datos asociados con esa sesión, comportándose efectivamente como si la sesión acabara de comenzar.Certeza en ambientes críticos.
Puede hacer que las cosas sean completamente controlables utilizando una lógica personalizada para colocar también un límite superior en la inactividad de la sesión; junto con el límite inferior desde arriba, esto da como resultado una configuración estricta.
Haga esto guardando el límite superior junto con el resto de los datos de la sesión:
Persistencia de id de sesión
Hasta ahora no nos hemos preocupado en absoluto por los valores exactos de cada ID de sesión, solo por el requisito de que los datos deben existir siempre que los necesitemos. Tenga en cuenta que, en el caso (poco probable) de que los ID de sesión le importen, se debe tener cuidado para regenerarlos
session_regenerate_id
cuando sea necesario.fuente
session_start()
también (de lo contrario no tiene ningún efecto) y solo si siempre llama a esos dos antessession_start
(de lo contrariogc_maxlifetime
tiene el potencial de afectar todas las sesiones actualmente abiertas, mientrassession_set_cookie_params
que solo puede afectar una nueva sesión que comienza con La solicitud actual).Si usa el manejo de sesión predeterminado de PHP, la única forma de cambiar de manera confiable la duración de la sesión en todas las plataformas es cambiar php.ini . Esto se debe a que en algunas plataformas, la recolección de basura se implementa a través de un script que se ejecuta cada cierto tiempo (un script cron ) que se lee directamente desde php.ini y, por lo tanto, cualquier intento de cambiarlo en tiempo de ejecución, por ejemplo
ini_set()
, a través de , no es confiable y probablemente no funcionaPor ejemplo, en los sistemas Debian Linux, la recolección de basura interna de PHP se deshabilita configurando
session.gc_probability=0
de manera predeterminada en la configuración, y en su lugar se realiza a través de /etc/cron.d/php, que se ejecuta en XX: 09 y XX: 39 (es decir, Cada media hora). Este trabajo cron busca sesiones anteriores a la session.gc_maxlifetime especificada en la configuración y, si se encuentra alguna, se eliminan. Como consecuencia, en estos sistemasini_set('session.gc_maxlifetime', ...)
se ignora. Eso también explica por qué en esta pregunta: las sesiones de PHP caducaron demasiado rápido , el OP tuvo problemas en un host pero los problemas cesaron al cambiar a un host diferente.Por lo tanto, dado que no tiene acceso a php.ini , si desea hacerlo de forma portátil, no es una opción usar el manejo de sesión predeterminado. Aparentemente, extender la vida útil de las cookies fue suficiente para su host, pero si desea una solución que funcione de manera confiable incluso si cambia de host, debe usar una alternativa diferente.
Los métodos alternativos disponibles incluyen:
Establezca un controlador de sesión (guardar) diferente en PHP para guardar sus sesiones en un directorio diferente o en una base de datos, como se especifica en PHP: Controladores de sesión personalizados (manual PHP) , para que el trabajo cron no lo alcance, y solo PHP Se lleva a cabo la recolección interna de basura. Esta opción probablemente puede usarse
ini_set()
para establecer session.gc_maxlifetime, pero prefiero ignorar el parámetro maxlifetime en migc()
devolución de llamada y determinar la vida útil máxima por mi cuenta.Olvídate por completo del manejo de sesión interna de PHP e implementa tu propia administración de sesión. Este método tiene dos desventajas principales: necesitará sus propias variables de sesión global, por lo que perderá la ventaja del
$_SESSION
superglobal, y necesita más código, por lo que hay más oportunidades para errores y fallas de seguridad. Lo más importante es que el identificador de sesión debe generarse a partir de números aleatorios o pseudoaleatorios criptográficamente seguros para evitar la previsibilidad de la ID de sesión (lo que lleva a un posible secuestro de sesión), y eso no es tan fácil de hacer con PHP de forma portátil. La principal ventaja es que funcionará de manera consistente en todas las plataformas y usted tiene control total sobre el código. Ese es el enfoque adoptado, por ejemplo, por el software del foro phpBB (al menos la versión 1; no estoy seguro de las versiones más recientes).Hay un ejemplo de (1) en la documentación de
session_set_save_handler()
. El ejemplo es largo, pero lo reproduciré aquí, con las modificaciones relevantes necesarias para extender la duración de la sesión. Tenga en cuenta la inclusión desession_set_cookie_params()
para aumentar la vida útil de las cookies también.El enfoque (2) es más complicado; básicamente, debe volver a implementar todas las funciones de sesión por su cuenta. No entraré en detalles aquí.
fuente
php.ini
sus opciones prácticas, están severamente restringidas./usr/lib/php5/maxlifetime
que no calculará un valor por debajo de 24 minutos. Por lo tanto, no puede establecer que los tiempos de espera de la sesión sean más bajos que eso.Agregar comentarios para cualquier persona que use Plesk que tenga problemas con cualquiera de los anteriores, ya que me estaba volviendo loco, establecer session.gc_maxlifetime desde su script PHP no funcionará ya que Plesk tiene su propio script de recolección de basura ejecutado desde cron.
Utilicé la solución publicada en el siguiente enlace para mover el trabajo cron de cada hora a diario para evitar este problema, entonces la respuesta superior anterior debería funcionar:
https://websavers.ca/plesk-php-sessions-timing-earlier-expected
fuente
Poner
$_SESSION['login_time'] = time();
en la página de autenticación anterior. Y el recortado a continuación en cada otra página donde desea verificar el tiempo de espera de la sesión.Editar: Esto solo funciona si ya usó los ajustes en otras publicaciones, o deshabilitó la Recolección de basura, y desea verificar manualmente la duración de la sesión. No olvide agregar
die()
después de una redirección, porque algunos scripts / robots podrían ignorarla. Además, destruir directamente la sesión ensession_destroy()
lugar de depender de una redirección para esa podría ser una mejor opción, nuevamente, en caso de un cliente malicioso o un robot.fuente
Solo un aviso para un servidor de alojamiento compartido o agregado en dominios =
Para que su configuración funcione, debe tener un directorio de sesión de guardado diferente para el dominio agregado utilizando php_value session.save_path "folderA / sessionsA".
Por lo tanto, cree una carpeta en su servidor raíz, no en public_html y para que no se acceda a publicidad desde el exterior. Para mi cpanel / servidor funcionó bien los permisos de carpeta 0700. Pruébalo ...
código php =
antes de session_start ();
o
.htaccess =
Después de muchas investigaciones y pruebas, esto funcionó bien para el servidor cpanel / php7 compartido. Muchas gracias a: NoiS
fuente
No. Si no tiene acceso a php.ini, no puede garantizar que los cambios tengan algún efecto.
Sin embargo, dudo que necesites extender el tiempo de tus sesiones.
Tiene un tiempo de espera bastante razonable en este momento y no hay razones para extenderlo.
fuente
SELECT id FROM gallery WHERE SortOrder > $currentsortorder LIMIT 1
Puede anular valores en php.ini desde su código PHP usando
ini_set()
.fuente
session.gc_maxlifetime
no es la configuración que controla la duración de la sesión. Puede ser golpeado hasta la obra como que si establecesession.gc_divisor
a1
, pero eso es simplemente horrible.gc_maxlifetime
establece el intervalo después del cual los datos de la sesión son elegibles para la recolección de basura: si el GC ocurre después de que haya transcurrido tanto tiempo, los datos de la sesión se destruirán (con la configuración predeterminada, esto es lo mismo que expirar la sesión). Pero GC se activa probabilísticamente en cada inicio de sesión, por lo que no hay garantía de que la sesión realmente caduque: puede trazar una curva de problema vs tiempo, pero no se verá como un muro de ladrillos. Eso es solo la punta del iceberg; ver stackoverflow.com/questions/520237/…