2011-10-19 9 views
36

En el manual de PHP, session.gc_probability y session.gc_divisor indican que gc se producirá en función de esta probabilidad. Lo entiendo.aclaración de la recolección de elementos no utilizados de PHP

Lo que no tengo claro es si esta probabilidad es sesión por sesión o general.

Entonces, si mi probabilidad es del 1% (1/100) ese GC ocurrirá, ¿eso significa que si una sesión se sigue ampliando, cada vez que haya un cambio del 1% se limpiará esa sesión específica? ¿O significa esto que el 1% de todas las sesiones existentes (así como también las nuevas) activarán GC para todas las demás sesiones existentes?

Estoy bastante seguro de que es lo último, solo quiero asegurarme.

El propósito de esta pregunta es que en nuestro sitio, quiero que los usuarios tengan sesiones de larga duración (6 meses). Si el 1% de todas las sesiones activan el GC, eso elimina efectivamente el propósito de tener esa sesión a largo plazo, ya que el GC terminará ocurriendo cada una o dos horas.

+2

pregunta muy interesante! +1 –

+0

relacionado http://stackoverflow.com/questions/3865303/debian-based-systems-session-killed-at-30-minutes-in-special-cron-how-to-overri –

+0

Para cualquier otra persona que lea este intento lo anterior, con 6 meses de archivos de sesión, puede causar serios problemas de rendimiento (como se indica a continuación). Sin embargo, puede usar session_set_save_handler() para escribir un controlador de sesión personalizado que usará el DB en lugar del FS, anulando muchas penalizaciones de rendimiento. – Meep3D

Respuesta

10

Cada vez que se ejecuta una secuencia de comandos PHP y se inicia la sesión hay una probabilidad de que barrerá la carpeta de la sesión acabando con la sesión anterior.

Limpieza solo eliminará sesiones a las que no se haya accedido dentro de un tiempo determinado. Sin embargo, PHP no garantiza que la sesión se destruirá dentro de ese tiempo.

Su estrategia de sesión a largo plazo debería funcionar bien, pero es posible que desee reducir al 1% a algo así como 0,1%

Otra cosa a tener en cuenta es que el sistema operativo pueda limpiar su carpeta/tmp durante reinicie así que incluso si PHP no lo hará.

+0

Reduje la probabilidad de 1/100 a 1/1000000 (0.000001%). Espero que solucione el problema. Además, este es un sitio de Magento, por lo que las sesiones se almacenan en/var/session. Esta carpeta, hasta donde yo sé, no es tocada por el servidor (pero supongo que se eliminará si se elige "Flush cache storage" del administrador de Magento). – pspahn

+0

Oh, esperemos que Magento no implemente sesiones alternativas que ignorarían la configuración de gc_ *. – romaninsh

+5

y el efecto secundario de reducir la probabilidad es que llene su disco duro con sesiones anteriores. y las sesiones tardarán más y más en encontrarlas y cargarlas, y al final del día todavía hay una posibilidad mínima de que limpie las sesiones de todos modos (aunque sea remotamente pequeño). Puede ver opciones alternativas como escribir su propio controlador de sesión y controlar exactamente qué sesiones desea eliminar y cuándo. No es tan difícil. http://www.php.net/manual/en/function.session-set-save-handler.php – bumperbox

2

No soy un experto en esto, pero al leer el manual, llamaría su atención a otra configuración, session.gc_maxlifetime. A partir de los documentos:

session.gc_maxlifetime especifica el número de segundos que se verá de datos como 'basura' y potencialmente limpiado. La recolección de basura puede ocurrir durante el inicio de la sesión (según session.gc_probability y session.gc_divisor).

Así que si se establece este valor a un valor adecuado (60 * 60 * 24 * 365/2 durante medio año, por lo 15768000), entonces los datos correspondientes no serán elegibles para la recolección de basura, sin importar lo que los demás ajustes son.

+1

Ya configuré gc_maxlifetime en 15552000 (180 días) - Todo parecía funcionar correctamente en el sitio de desarrollo, pero una vez que lo implementé, funcionó por un tiempo antes de que comenzara a devolver a los usuarios a la página de inicio de sesión. – pspahn

+7

¿este valor significa "segundos después de la creación de la sesión" o "segundos después de la última modificación"? –

+0

Necesitaría una combinación de posponer el recolector de basura para que los datos de la sesión estén allí en el diccionario pero también extiendan la vida útil de la cookie para que guarde el id. De sesión exclusivo para esa fila de datos de sesión si lo entiendo correctamente. – vikingben

7

última vez que miré en la fuente cada llamada a session_start() "rodó los dados" por así decirlo, usando el divisor y la probabilidad. Si pulsa, eliminará todos los archivos del directorio session.save_path anteriores a session.gc_maxlifetime. Olvidé si usaba modificación o tiempo de acceso del archivo, aunque no debería importar en circunstancias normales porque php sobrescribe el archivo de sesión de forma predeterminada al final de la ejecución del script, por lo que los tiempos de modificación y acceso casi siempre deben coincidir muy de cerca.

// Rough psuedo code of how php's session_start() function works regarding garbage collection. 
function session_start() { 
    $percentChanceToGC = 100 * ini_get('session.gc_probability')/ini_get('session.session.gc_divisor'); 
    $shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC; 
    if ($shouldDoGarbageCollection) { 
     $expiredCutoffTime = time() - ini_get('session.gc_maxlifetime'); 
     foreach (scandir(ini_get('session.save_path')) as $sessionFile) { 
      if (filemtime($sessionFile) < $expiredCutoffTime) { 
       unlink($sessionFile); 
      } 
     } 
    } 

    // ... rest of code .... 
} 

no sé cuántos archivos de sesión que va a terminar teniendo colgar alrededor si quieres que vivan durante un mínimo de 6 meses. Considere que puede tomar un poco de tiempo para que php muestre muchos miles de archivos para determinar su edad. Quizás considere otras opciones para el almacenamiento duradero de estos datos. O puede deshabilitar php gc y simplemente ejecutar un trabajo cron para eliminar archivos de sesión obsoletos.De lo contrario, ese 1% de las solicitudes activarán gc y tendrán que esperar a php; en otras palabras, podría retrasarse.

Cuestiones relacionadas