Ajuste da sessão do Memcache + PHP: Como o memcache expira as chaves?

7

Eu fiz algumas pesquisas sobre isso e não encontrei uma resposta definitiva.

Temos um aplicativo da web que está usando o manipulador de sessão PHP + Memcache.

Eu tenho várias perguntas, todas inter-relacionadas, mas no final das contas, meu problema é: "Por que as sessões de PHP aparentemente não estão expirando quando achamos que deveriam estar?" Ou seja, o usuário final deve ser desconectado do aplicativo após um tempo definido, mas não é.

Aqui estão os pontos, por favor, ajude-me a ligá-los e diga-me onde estou enganado:

  • Meu entendimento é que o Memcache expira as chaves com base no tempo definido, em segundos (ou no carimbo de data / hora unix para valores maiores).
  • A expiração é preguiçosa - por exemplo, nada é excluído com antecedência
  • O manipulador de sessão PHP memecache usa o sessions.gc_max_lifetime para definir a expiração da chave do memcache. idk, talvez não?
  • O Memcache deve, ao exibir uma chave solicitada e ver que ela está expirada, não a veicular (e talvez também excluí-la?). Mas pelo menos não servir.
  • Este ato de não atendê-lo deve, para o PHP, equacionar uma sessão excluída e o usuário estar desconectado.

Os usuários não estão sendo desconectados.

Como posso depurar isso? Memcache não é exatamente transparente.

O exemplo de caso que não está funcionando é um site com um tempo limite de sessão definido para duas horas. Um exemplo de usuário usaria o site pela última vez à noite e, 8 a 10 horas depois, voltaria ao site e ainda estaria conectado.

    
por JDS 24.10.2011 / 18:20

1 resposta

10

Nós encontramos isso também, mas conseguimos investigar e descobrir exatamente o que está acontecendo. Os sintomas que encontramos foram que o memcache (com uma alocação de memória razoavelmente grande em execução em vários servidores) começou a despejar conteúdo. Isso é indesejável, pois pode afetar negativamente os visitantes atuais no site.

Ao monitorar o tráfego de rede, vimos mensagens do PHP para o Memcache da seguinte forma:

set memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823 dados ...

É o segundo zero que causa os problemas - isso dita a quantidade de tempo que o memcache armazena o item em cache. Ao defini-lo para zero, o memcache nunca expira este item. No seu caso, isso significa que os usuários podem retornar horas depois e continuar acessando seu site. Em nosso caso, o memcache estava sendo preenchido e causando o despejo dos dados desejados.

Eu cavei mais, e tudo se resume à extensão PHP memcached. A partir de 1.0.2 (que estamos executando), este código diz:

sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
if (sess_lifetime > 0) {
    expiration = time(NULL) + sess_lifetime;
} else {
    expiration = 0;
}

Neste trecho, é ZEND_STRL("session.gc_maxlifetime") que não está retornando o valor esperado. Isso foi relatado como um bug para o PHP, e uma correção para a biblioteca do memcached é descrita no link .

Eu implantei este patch, revisei o tráfego de rede e descobri que ele define o tempo de expiração conforme o esperado.

    
por 16.01.2012 / 18:45