Melhor maneira de executar sessões baseadas em mySQL do lado do administrador (sem modificar o código php)

1

Eu gostaria de configurar sessões mysql no meu ambiente de hospedagem que funcione para todos os meus clientes em todo o meu ambiente de carga balanceada. Depois de algumas pesquisas, parece que as soluções da maioria das pessoas envolvem substituir seus manipuladores de sessão pelo código php. Como não sou o administrador da web de todos os sites que hospedo, prefiro não tocar no próprio código PHP.

Existe um caminho através da configuração do Apache ou PHP para adicionar código PHP que é processado para todas as páginas? Ou há um manipulador de sessão do mysql preferido que as pessoas usam? o único que encontrei é o link o que parece um pouco menos documentado e suportado do que eu gostaria para um ambiente de produção.

Obrigado

    
por Talik 06.01.2012 / 21:14

2 respostas

3

Não está muito claro na sua pergunta, mas vou presumir que você está perguntando como lidar com sessões PHP em um cluster de servidores (com balanceamento de carga).

Sessões PHP tradicionais são armazenadas em arquivos simples - a localização e detalhes são configurados no php.ini. O problema com isso e um cluster de servidores é, obviamente, que um arquivo de sessão criado em um servidor não está disponível em nenhum outro servidor.

Existem várias soluções para esse problema, cada uma com suas próprias vantagens e desvantagens.

Sessões aderentes:

Faça com que seu balanceador de carga chame o IP solicitante e sempre envie o mesmo usuário para o mesmo servidor. Isso pode funcionar para lidar com sessões, mas ele é muito mal dimensionado, não lida bem com nós com falha e não permite um balanceamento de carga mais eficiente (com base na carga).

Sistemas de arquivos em cluster:

Usando um sistema de arquivos distribuído, você pode replicar suas sessões em vários nós, e cada nó pode ter acesso às sessões igualmente. Uma configuração típica de dois nós pode incluir o DRBD e o OCFS2, mas você encontra dificuldades para configurar a pulsação e o failover. Um sistema mais resiliente pode usar o GlusterFS, mas adiciona uma sobrecarga considerável. Ambas as abordagens podem encontrar alguns problemas com o bloqueio de arquivos, embora o GlusterFS deva funcionar razoavelmente bem (suporta o flock ()).

RDBMs

:

Como você mencionou, é possível armazenar sessões no MySQL (e no PgSQL). Os bancos de dados costumam estar instalados e disponíveis para vários nós e suportam o bloqueio para transações atômicas. No entanto, o conjunto de recursos de um banco de dados relacional não é realmente necessário para armazenar arquivos simples e pode adicionar uma certa quantidade de sobrecarga desnecessária. (PHP usado para empacotar a extensão msession que, acredito, não é mais mantida).

NoSQL:

Armazenamentos de valores-chave recentes são adequados para armazenar sessões PHP. Anteriormente, pode ter havido alguma dificuldade com bloqueio e autenticação, mas acredito que a maioria deles tenha sido resolvida. Exemplos nesta categoria podem incluir o MongoDB e o CouchDB.

Armazenamento volátil:

Alguns caches de memória são bem estabelecidos e comumente usados em sistemas distribuídos (por exemplo, Memcached, Redis). Esses armazenamentos de valor-chave oferecem a maior parte do que é necessário para o gerenciamento de sessões, e o memcached em particular é muito fácil de configurar como um armazenamento de sessão. No entanto, eles tendem a ter duas grandes desvantagens: a) se o servidor que armazena as sessões cair ou precisar ser reiniciado, os dados da sessão são perdidos, pois são armazenados na memória eb) conforme os dados da sessão aumentam, o uso da memória aumenta , o que pode resultar na remoção de objetos antigos do cache.

Uma solução proposta:

A maioria das boas soluções combinará um cache com algum armazenamento persistente - para evitar o carregamento excessivo do banco de dados, mas proteger contra a perda de dados. Infelizmente, essas soluções geralmente exigem a modificação do código PHP para incluir um session_save_handler personalizado.

Uma boa solução, porém, que não requer modificação do código PHP é MemBase . Ele é executado no mesmo protocolo que o memcached - tornando-o facilmente configurado para uso como manipulador de sessão, mas também fornece persistência.

Essencialmente, a configuração envolve:

  • Baixe e instale o aplicativo MemBase (binários disponíveis em .deb e .rpm)
  • Configure o servidor (ele tem uma interface da Web - não é ideal, mas faz o trabalho)
  • Instale a extensão do php5-memcached (mas não instale o memcached pois ele está em conflito com o MemBase)
  • Altere seu session.save_handler e session.save_path no php.ini para apontar para o servidor MemBase
  • Reinicie seu servidor da web, php-fpm etc. (uma pesquisa rápida encontra este guia , que parece razoável )

A abordagem deve ser bem dimensionada, você tem controle sobre a quantidade de memória usada, os dados são persistentes, o desempenho é bom com sobrecarga mínima, a configuração é fácil e não requer a alteração de nenhum código PHP (apenas mudando algumas configurações do php.ini).

    
por 07.01.2012 / 03:30
0

Para qualquer pessoa interessada nisso, parece que o PHP tem uma configuração que pode ser definida através do arquivo ini chamado auto_prepend_file. Isso pode ser usado para criar um script de manipulação de sessão que será executado para todos os sites sem qualquer modificação no próprio código do site.

    
por 12.01.2012 / 18:54

Tags