Qual é a melhor e mais segura maneira de lidar com sessões PHP. É a melhor maneira de armazenar sessões em:
Banco de dados (mais confiável, mas com alto gargalo, velocidade lenta, não é bom para sites com alto uso de banco de dados)?
Memcache (super rápido, mas distribuiu mais problemas de segurança, chances de perder dados quando o servidor reiniciou e chances de perder dados quando o cache está cheio)?
Arquivos (opção padrão, acho lenta, pois lê e grava a partir de E / S de arquivos, menos segurança, etc.).
Qual método é o melhor? Quais são os problemas e as coisas boas de cada uma dessas abordagens?
Respostas:
O melhor é armazenar no Memcached, pois podemos resolver facilmente os outros problemas (tamanho do cache, segurança etc.)
Como resolver os outros problemas?
fonte
Para a grande maioria dos aplicativos diários, manter as sessões nos bancos de dados é bom. O volume e o nível de simultaneidade que um servidor sql pode manipular será mais que suficiente. A chave é manter cada entrada pequena em tamanho e limpar as linhas desnecessárias com regularidade. E indexação adequada, é claro.
O sistema de arquivos - nunca vi a necessidade de fazer isso. Prefiro a simplicidade de gerenciar linhas em tabelas do que milhares de pequenos arquivos. Além disso, você não pode consultar os arquivos se quiser pesquisar as estatísticas da sessão.
Lembre-se, com o PHP, é fácil trocar os manipuladores de sessão. Assim, você pode começar com um formato de armazenamento e migrar para outro sem muito aborrecimento.
fonte
Que tal usar o mecanismo de armazenamento MEMORY no MySQL?
Não é tão rápido quanto o Memcache, mas tem a vantagem de poder usar SQL simples e também pode usar o mecanismo de armazenamento normal quando não for necessário e alternar para MEMORY quando o número de usuários / solicitações aumentar.
Estou usando-o para armazenar grandes quantidades de dados estatísticos em um aplicativo Web que muda frequentemente, para que não seja usado para lidar com sessões, mas acho que deve ser adequado para esse fim.
fonte
Esta postagem no blog mostra os resultados de uma comparação de desempenho de diferentes mecanismos de armazenamento de sessão com o Magento e eles parecem ter concluído que até 75 usuários simultâneos não há realmente uma diferença de desempenho entre eles.
Eu acho que nesses níveis (eles tinham cerca de 5 transações por segundo, o que seria cerca de 430k ocorrências em um período de 12 horas), a sobrecarga em todo o resto domina os números de desempenho que você vê, já que o arquivo / DB / Memcache / Redis lidará felizmente o tráfego sem suar se usado corretamente.
Isso deixa outros fatores, como escalabilidade, confiabilidade e segurança.
Gostaria de dizer primeiro que qualquer coisa que comprometa seu armazenamento de arquivos provavelmente comprometerá qualquer outra coisa, já que um invasor pode apenas modificar o código do aplicativo ou, pelo menos, descobrir chaves e protocolos / credenciais de acesso ao armazenamento, mesmo que tenham somente leitura Acesso. O armazenamento de arquivos funcionará bem em sites de baixo volume, é fácil de configurar e fácil de raciocinar. Por mais que você diga que atingiu o disco, uma leitura do banco de dados também atingirá o disco e, se o banco de dados puder armazená-lo em cache, provavelmente o sistema operacional também armazenará em cache o arquivo da sessão. Além disso, seu arquivo é lido, e seu sistema de arquivos é brilhante para alcançá-lo, se você já sabe o nome. Se você está usando PHP, sabe quantas leituras de arquivo o sistema precisa fazer apenas para atender seu aplicativo? A desvantagem é que você pode '
O Memcache é relativamente rápido e, se você considerar as soluções de classe do Memcache de maneira mais ampla (Redis, etc), há algumas que prometem persistência com leituras na memória para maior velocidade, para que você obtenha o máximo dos dois mundos. Eles também são relativamente simples de raciocinar e a natureza do valor-chave das sessões é exatamente o que elas foram projetadas para fazer. Você sabe quanto você precisaria colocar em uma sessão para preencher uma dessas? De qualquer maneira, todas as suas opções forçarão você a se comprometer se você atingir a capacidade delas. Os discos são preenchidos com arquivos (número e fator de tamanho aqui), os armazenamentos de cache possuem capacidade e os bancos de dados têm um número limitado de linhas e os mesmos limites de capacidade de disco que a abordagem de arquivo. Além disso, esses sistemas são distribuídos apenas se você os executar de maneira distribuída. A maioria funciona bem com uma única configuração de servidor. Se você os distribuir, provavelmente já terá servidores da Web / servidores de banco de dados, etc, para que os problemas do sistema distribuído certamente não apareçam na sua opção de armazenamento de sessão. No entanto, quando você deseja 10x o tráfego / capacidade etc, chegar lá é muito mais natural com isso do que com o esquema de armazenamento de arquivos. Alguns armazenamentos de chave / valor também permitem realizar análises simples dos dados da sessão com relativa facilidade, mas a maioria não o leva nem perto do que o SQL pode fazer.
Não sei por que você propõe que o banco de dados seja mais confiável do que as outras opções, mas recebo o apelo do banco de dados, pois seu aplicativo PHP provavelmente já o utiliza. Isso significa que você não adiciona outra dependência do servidor e provavelmente pode reutilizar a mesma conexão usada para buscar dados da sessão para obter dados do usuário, para não precisar estabelecer uma para dados, uma para Memcache, etc. Se você indexar o tabela, ele também terá um desempenho razoavelmente rápido e fornece semânticas bastante simples com as quais você já está familiarizado para colher sessões antigas ou até mesmo analisar dados de sessão (não sei por que você gostaria e se não o é, provavelmente isso não significa ' importa tanto). Escalar para escalas maciças não é tão trivial quanto em algo como Redis,
Eu acho que essa escolha não é tão importante no começo. Cada abordagem tem desafios e vantagens e coisas em que você deve pensar. De um modo geral, você provavelmente pode usar apenas os padrões do PHP / qualquer estrutura que você use ou mesmo a coisa mais fácil de seguir. Se a escolha for ruim posteriormente, suas análises de desempenho informarão e você estará armado com os dados necessários para fazer as escolhas apropriadas, dada a natureza específica do tráfego recebido. Na frente, tudo o que você pode razoavelmente ter é especulação geral.
fonte
Isso depende de suas necessidades.
Existem algumas diferenças entre arquivos e armazenamento de banco de dados. Veja esta pergunta .
No entanto, você pode fazer o que é feito no Rails 3 por padrão e usar apenas cookies criptografados para sua sessão. Assim, você criptografa todos os valores de uma maneira que somente você pode descriptografar mais tarde (por exemplo, chaves privadas / públicas) e deixa o cliente fazer o estado mantendo você.
Por um lado, limita-o a 4Kb, o que geralmente é suficiente (já que você geralmente deseja armazenar IDs, não objetos inteiros), mas o benefício realmente bom que você obtém é que não precisa se preocupar com a limpeza da sessão. Você deixa isso para o cliente, onde realmente deveria estar.
fonte
Para minha situação específica, posso dizer que as sessões em um banco de dados são a causa número um de travamentos de servidores por uma boa margem. nossa tabela de sessões é corrompida com frequência suficiente para que possamos truncá-la preventivamente.
O memcache parece atraente, mas temos muitos processos que limpam todo o memcache, para que as sessões do usuário sejam cortadas com muita frequência. e as sessões mais antigas seriam limpas à medida que a memória se tornasse cheia ... para que não haja mais logins permanentes.
Em breve, tentaremos as sessões baseadas em arquivo padrão.
Se você está preocupado com a segurança dos dados da sua sessão, não deve colocá-los na sessão - e não confiar nela - validar o usuário em todas as solicitações.
fonte
Você pode tentar salvar sua sessão no Redis . O Redis é rápido como o Memcached, mas também possui várias opções de persistência de dados. Além disso, vários clientes PHP são suportados.
Além disso, você pode experimentar serviços de terceiros, como o Memcached Cloud, que possui recursos internos de replicação e mecanismo de armazenamento
Divulgação, Sou Co-Fundador e CTO do Garantia Data.
fonte