Pergunta

No trabalho que fazemos quase tudo em Java e Perl, mas eu queria construir um recurso usando PHP e sessões. Algumas espreitadelas pensou que era uma má idéia para tentar fazer sessões PHP em nosso sistema, porque está distribuída a vários servidores. Qual seria o problema específico ser?

Foi útil?

Solução

A resposta à sua pergunta específica, qual seria o problema ser, reside no fato de que, por padrão PHP armazena suas sessões em arquivos no sistema de arquivos. Para um único servidor web servindo pedidos, este não é um problema porque os dados sessão estará sempre disponível. Mas e se você tivesse dois servidores Web com balanceamento de carga servindo pedidos?

Imagine que bater o primeiro servidor web com um pedido, que cria o arquivo de sessão em seu sistema de arquivos. Em seguida, o seu próximo pedido atinge o segundo servidor. O segundo servidor web é claro que não vai ver o arquivo de sessão. Para o usuário, você pode logar em um site, e então de repente ser desconectado.

Este não é um problema específico para PHP, e é muito comum. A solução é armazenar dados de sessão em alguma área comum. O método mais comum para isso é para armazenar dados de sessão ou em um banco de dados acessível a todos os servidores web, ou algum servidor de cache de memória compartilhada como memcached.

Outras dicas

Você também pode usar uma sessão de costume save handler:

http://www.php.net/ manual / en / function.session-set-save-handler.php

Não tenho nem nunca tentou fazê-lo, mas com ele você definir seu próprio save / funções de leitura, para que possa implementar um banco de dados ou um NFS backend sem a necessidade de instalar qualquer extensão.

Além disso Msession, que foi sugerido por @Eran Galperin, parece muito interessante como uma alternativa ao que eu mencionei antes.

sessões persistentes em vários servidores (também conhecidos como clusters sessão) é um problema comum para escalar aplicações web, e não é específico para PHP. PHP não oferece várias soluções para lidar com isso, como o Zend Platform (servidor de aplicação comercial) e Msession (extensão).

Um grande pergunta vaga, mas eu diria que o problema é maior do que o mencionado nas respostas. Claro que você pode substituir como carga e biscoitos poupança, mas há um custo para isso, também. Por exemplo, você terá que considerar os seguintes cenários / perguntas:

  • Se você está colocando os biscoitos em outro host, como isso afetará a velocidade de seus cookies? Isso, obviamente, depende de quantas escreve / lê que você faz.
  • Você está fazendo isso para aumentar a velocidade ou ter failover? A resposta vai certamente levar a soluções diferentes:
    • Você está fazendo isso para failover, como você vai lidar com se o seu servidor web (s) não pode acessar o armazenamento de sessão porque link de rede vai para baixo? E se o seu armazenamento de sessão vai para baixo? Você terá que resolver isso usando algum tipo de replicação mestre-master, possivelmente em execução que distribuiu armazenamento de sessão na mesma máquina que o servidor web para alta disponibilidade adicional (se todas as sessões podem caber na memória). Ter um olhar para Riak ou similar para a replicação mestre-master.
    • Você está simplesmente fazendo isso para a velocidade, eu usaria apache, nginx ou haproxy (mais rápido) para simplesmente fazer balanceamento de carga com base no endereço IP do cliente. Dessa forma, você não tem que se preocupar com a criação de uma loja de sessão distribuída. Claro, se um de seus PHP-instances vai para baixo seus usuários perderão seus cookies, mas talvez isso não é um problema. Cabe a você.

mais fácil é memcached ou Redis.

aqui é como fazê-lo em redis - estamos a usá-lo no momento: http://redis4you.com/articles.php ? id = 001 & name = Redis + como + sessão + manipulador + in + PHP

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top