Descrição do problema
Alguns usuários de PHP relatam que seus testes de desempenho no ApsaraDB for Memcache não atingem as métricas esperadas. Na maioria desses casos, a aplicação acessa o ApsaraDB for Memcache por meio do service web Apache e utiliza conexões de curta duração. Cada conexão de curta duração tem um custo superior ao de uma simples reconexão de socket, pois também executa um procedimento complexo de reautenticação. Esse custo é muito maior do que o de uma solicitação comum, o que reduz significativamente a eficiência do seu site.
@id="h2-solution2"
Solução
Por isso, recomendamos substituir as conexões de curta duração por conexões persistentes. No entanto, o ApsaraDB for Memcache exige a extensão PHP Memcached, que, diferentemente da extensão memcache, não fornece a interface pconnect. As etapas a seguir mostram como configurar uma conexão persistente em PHP.
Conforme a documentação do PHP Memcached:
Description
Memcached::__construct ([ string $persistent_id ] ) Creates a Memcached instance representing the connection to the memcache servers.
Parameters
persistent_id By default the Memcached instances are destroyed at the end of the request. To create an instance that persists between requests, use persistent_id to specify a unique ID for the instance. All instances created with the same persistent_id will share the same connection.
Ou seja, você compartilha uma conexão passando o mesmo persistent_id para o construtor. O código é o seguinte:
<?php
$memc = new Memcached('ocs');// The 'ocs' here is the persistent_id
if (count($memc->getServerList()) == 0) /* Check before you establish a connection */
{
echo "New connection"."<br>";
/* Keep every option inside the condition, because some options cause a reconnection and turn a persistent connection into a short-lived one. */
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->setOption(Memcached::OPT_TCP_NODELAY, true); //Important. PHP Memcached has a bug that adds a fixed 40 ms delay when the value you get does not exist. Enable this option to avoid the bug.
/* The addServer code must also stay inside the condition. Otherwise you build the 'ocs' connection pool again, which can cause exceptions in the PHP client program. */
$memc->addServer("your_ip", 11212);
$memc->setSaslAuthData("user", "password");
}
else
{
echo "Now connections is:".count($memc->getServerList())."<br>";
}
$memc->set("key", "value");
echo "Get from OCS: ".$memc->get("key");
//$memc->quit();/* Never add quit at the end of the code. Otherwise the connection becomes short-lived. */
?>
Os três pontos que exigem atenção no código anterior estão marcados com comentários. A palavra-chave ocs no construtor funciona como um pool de conexões: qualquer código que precise de uma conexão chama new Memcached('ocs') e obtém uma do pool.
Resultado
Coloque o código anterior no diretório de trabalho do Apache /var/www/html/, nomeie-o como test.php e insira http://your_ip:80/test.php no navegador. Nas primeiras 8 solicitações, o navegador exibe a seguinte saída:
New connection
Get from OCS: value
Isso significa que cada uma dessas 8 solicitações cria uma nova conexão, e todas as solicitações subsequentes reutilizam uma das 8 conexões. Uma captura de pacotes também mostra que todo o tráfego após a 8ª solicitação trafega por conexões persistentes, sem reconexão de socket e sem autenticação.
Por que existem 8 conexões? O arquivo de configuração httpd.conf mostra que o Apache inicia 8 processos filhos:
#StartServers: numbers of server processes to start
StartServers 8
Portanto, o pool de conexões do persistent_id ocs inicializa exatamente 8 conexões, e todas as solicitações posteriores utilizam essas mesmas 8 conexões.
Em seguida, teste a navegação entre páginas. Copie o arquivo PHP e mantenha ocs como o persistent_id do construtor que estabelece a conexão. A solicitação passa de uma conexão para outra porque um processo filho diferente do Apache a processa, mas não ocorrem autenticação nem reconexão de socket. Isso comprova que a configuração de conexão persistente do PHP Memcached funciona corretamente. O PHP-FPM é o modo normalmente utilizado: o processo FPM mantém uma conexão persistente com o servidor Memcached, de modo que o ciclo de vida dessa conexão é igual ao ciclo de vida do processo Apache.
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
Copie os placeholders xref (
{XREF_N}) literalmente, sem traduzi-los ou modificá-losAplique rigorosamente todas as regras específicas do idioma
Aplique as regras de stopwords com tolerância zero
Utilize o modo imperativo em passos numerados e listas de procedimentos
Garanta a consistência terminológica — o mesmo termo deve ter a mesma tradução em todo o documento
Varie os inícios de frase em listas e tabelas — nenhum início deve se repetir mais de 3 vezes
Retorne APENAS o documento markdown em português do Brasil, sem explicações