Contexto
Ao criar um site em PHP, é comum armazenar dados na variável global $_SESSION para facilitar o acesso. O arquivo de configuração ini do PHP contém definições da seção [Session] que determinam se os dados serão salvos em arquivo ou no servidor Memcached. Essa decisão depende do parâmetro session.save_handler = memcached. Na maioria dos casos, não há necessidade de persistência para os dados de sessão. Dessa forma, armazenar essas informações em cache no Memcached melhora o desempenho do site.
Descrição do problema
Tanto o ApsaraDB for Memcache quanto instâncias de Memcached auto-hospedadas seguem o protocolo padrão do Memcached. Para reduzir o uso de memória dos servidores e diminuir custos com manutenção, alguns usuários desejam migrar as informações de sessão do Memcached auto-hospedado para o ApsaraDB for Memcache sem alterar o código-fonte. Este tópico orienta você a resolver problemas que podem surgir durante esse processo de migração.
A principal diferença entre o ApsaraDB for Memcache e o Memcached auto-hospedado reside na autenticação por conta e senha.
ApsaraDB for Memcache: Trata-se de um cluster distribuído que oferece serviços externos de maneira unificada. Ele garante balanceamento de carga sem ponto único de falha (SPOF) e permite ajustes flexíveis de configuração sem reiniciar o serviço. Além disso, possui mecanismos de segurança integrados, como lista de permissões, limitação de taxa e autenticação por conta e senha.
Memcached auto-hospedado: A maioria das instâncias auto-hospedadas não exige conta ou senha, portanto, diferentemente do ApsaraDB for Memcache, elas não possuem autenticação SASL. Para migrar as informações de sessão armazenadas no Memcached auto-hospedado para o ApsaraDB for Memcache, configure a conta e a senha no arquivo php.ini.
Solução
-
Versões mais antigas da extensão PHP Memcached não suportam esse recurso. Atualize a extensão PHP Memcached para a versão 2.2.0. Execute os comandos abaixo:
wget http://pecl.php.net/get/memcached-2.2.0.tgz tar zxvf memcached-2.2.0.tgz cd memcached-2.2.0 phpize ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl make make install Localize o arquivo memcached.so atualizado e execute o comando stat para confirmar a atualização (verifique a data da última modificação).
-
Modifique a configuração do arquivo php.ini.
-
Seção Session: Localize a seção [Session] e altere o mecanismo de armazenamento para:
session.save_handler = memcached **(Attention: it has a d)**Altere o endereço de armazenamento, ou seja, o endereço de acesso ao Memcache, para:
session.save_path = "be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com:11211" (Attention: for an extension with a d, no preceding tcp:// is needed. For an extension without a d, the preceding tcp:// is required)Defina o tempo de vida da chave em cache no Memcached:
session.gc_maxlifetime = 1440 (Unit: second. A reasonable life time is strongly recommended to make sure that only hotspot data is cached in ApsaraDB for Memcache) -
Seção Memcached: Na área global do arquivo php.ini, crie uma seção [memcached] separada e adicione a seguinte configuração no espaço disponível:
[memcached] memcached.use_sasl = On memcached.sess_binary = On memcached.sess_sasl_username = "your_ocs_name" memcached.sess_sasl_password = "your_ocs_password" memcached.sess_locking = Off
-
As etapas de instalação estão concluídas. Para consultar outros parâmetros úteis nas seções Memcached e Session mencionadas anteriormente, acesse os links abaixo.
http://php.net/manual/en/memcached.configuration.php
http://php.net/manual/en/session.configuration.php
Testes
Crie o seguinte código de teste no arquivo session.php:
<?php
session_start();
$sn = session_id();
echo "session id:".$sn."\n";
$_SESSION["ocs_key"]="session_value";
echo "session:".$_SESSION["ocs_key"]."\n";
?>
A saída será semelhante a esta:
session id:ttrct9coa2q62r2sodlq4qf376
session:session_value
Recupere os dados gravados pelo script session.php diretamente do Memcache usando o código de teste no arquivo get.php.
<?php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer("be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com", 11211);
$memc->setSaslAuthData("your_ocs_name", "your_ocs_password");
echo $memc->get("memc.sess.key.ttrct9coa2q62r2sodlq4qf376");
/*Attention: Here the key has a prefix defined by the memcached.sess_prefix field in php.ini. The default value is "memc.sess.key." The prefix is followed by the sessionid "ttrct9coa2q62r2sodlq4qf376" as shown above. */
?>
Saída esperada:
ocs_key|s:13:"session_value";
Esse resultado indica que a SESSION do PHP foi gravada com sucesso no Memcache.
Instruções
Leia o conteúdo em inglês para compreender O QUE precisa ser comunicado
Escreva o texto em português do Brasil DO ZERO — esqueça a estrutura das frases em inglês
Preserve toda a formatação markdown, blocos de código, links e imagens exatamente como estão
Tags xref (
<a data-tag="xref" ...>texto</a>) — preserve a TAG INTEIRA com todos os atributos na ordem e caixa originais, traduza APENAS o texto visível entre > eAplique todas as regras específicas do idioma rigorosamente
Aplique as regras de stopwords com tolerância zero
Use o modo imperativo em passos numerados e listas procedimentais
Garanta consistência terminológica — mesmo termo = mesma tradução em todo o documento
Varie os inícios de frase em listas/tabelas — nenhum início deve se repetir 3+ vezes
Retorne APENAS o documento markdown em português do Brasil, sem explicações