Recentemente, tenho trabalhado na otimização do desempenho do programa e tenho uma ideia interessante que gostaria de compartilhar com vocês.
Cache é um modo de aplicação típico da estratégia de “espaço por tempo” e um método importante para melhorar o desempenho do sistema. O uso do cache pode reduzir bastante o número de operações de banco de dados no caso de grandes volumes de acesso, reduzindo significativamente a carga do sistema e melhorando o desempenho do sistema. Comparado ao cache de página, o conjunto de resultados é um tipo de “dados brutos” que não contém informações de formato. A quantidade de dados é relativamente pequena e pode ser formatada novamente, por isso é bastante flexível. Como o PHP é uma linguagem de script que "compila e executa ao mesmo tempo", ele também fornece um método muito conveniente de usar o cache do conjunto de resultados até certo ponto - usando o cache incluindo dinamicamente o segmento de código de definição de dados correspondente. Se um cache for construído em "RamDisk", a eficiência deverá ser melhorada ainda mais. Abaixo está um pequeno código de exemplo para referência.
//carrega dados com cache
função load_data($id,$cache_lifetime) {
// os dados de retorno
$dados = array();
// cria o nome do arquivo de cache
$cache_filename = 'cache_'.$id.'.php';
// verifica a hora da última modificação do arquivo de cache
$cache_filetime = arquivotime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** o cache não expirou
include($cache_filename);
} outro {
//** o cache expirou
//carrega dados do banco de dados
// ...
while ($dbo->nextRecord()) {
// $dados[] = ...
}
// formata os dados como um arquivo php
$data_cache = "
while (lista($chave, $val) = cada($dados)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NOME'=>"".qoute($val['NOME'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache.= ";);rn";
}
$data_cache = "?>rn";
//salva os dados no arquivo de cache
if ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
retornar $dados;
}
?>
Situações aplicáveis:
1. Os dados são relativamente estáveis, principalmente operações de leitura.
2. As operações de arquivo são mais rápidas que as operações de banco de dados.
3. Acesso a dados complexos, acesso a grandes volumes de dados, acesso intensivo a dados e carga extremamente pesada no banco de dados do sistema.
4. Estrutura de separação Web/DB ou estrutura de banco de dados único multi-Web.
Pergunta não confirmada:
1. Se a leitura e gravação de arquivos durante o acesso simultâneo causará problemas de bloqueio.
2. Qual é o desempenho quando há muitos arquivos de dados envolvidos?
Ideias de extensão:
1. Gere o código de definição de dados JavaScript e chame-o no cliente.
2. Ainda não pensei nisso…
Espero discutir juntos.
esconderijo
Se você deseja que seu enorme aplicativo PHP tenha melhor desempenho, usar o cache também é uma boa maneira. Existem muitas soluções de cache disponíveis, incluindo: Zend Cache, APC e Afterburner Cache.
Todos esses produtos são “módulos de cache”. Quando ocorre pela primeira vez uma solicitação de um arquivo .php, eles salvam o código intermediário PHP na memória do servidor web e, em seguida, respondem às solicitações subsequentes com a versão "compilada". Essa abordagem pode realmente melhorar o desempenho do aplicativo porque reduz ao mínimo o acesso ao disco (o código foi lido e analisado) e o código é executado diretamente na memória, fazendo com que o servidor responda às solicitações com muito mais rapidez. Obviamente, o módulo de cache também monitorará as alterações nos arquivos de origem PHP e armazenará novamente a página em cache, se necessário, evitando assim que o usuário obtenha páginas que ainda são geradas por código PHP desatualizado. Como os módulos de cache podem reduzir significativamente a carga no servidor e melhorar a eficiência de resposta dos aplicativos PHP, eles são muito adequados para sites com cargas pesadas.
Como escolher esses produtos de cache
Zend Cache é um software comercial da Zend Technologies, a empresa mencionada anteriormente que nos fornece o mecanismo PHP e o Zend Optimizer gratuito. Zend Cache é realmente bem merecido! Para páginas PHP grandes, você pode sentir que a velocidade aumentará após a primeira execução e o servidor terá mais recursos disponíveis. Infelizmente, este produto não é gratuito, mas em alguns casos ainda pode ter um grande valor.
Afterburner Cache é um módulo de cache gratuito da Bware Technologies. Este produto está atualmente em versão Beta. O Afterburner Cache é semelhante ao Zend Cache, mas não melhora o desempenho tanto quanto o Zend Cache (ainda) e não funciona com o Zend Optimizer.
APC é a abreviatura de Alternative PHP Cache, que é outro módulo de cache gratuito do Community Connect. O produto já é estável o suficiente para uso formal e parece melhorar em grande medida a velocidade de resposta às solicitações.
Sobre compactação
O módulo mod_gzip gratuito do Apache da Remote Communications tem a capacidade de compactar conteúdo estático da Web para navegadores que suportam esse tipo de codificação de conteúdo. Para a grande maioria do conteúdo estático da web, mod_gzip funciona muito bem. mod_gzip pode ser facilmente compilado no Apache e também pode ser usado como DSO. De acordo com Remote Communications, mod_gzip também pode compactar conteúdo dinâmico de mod_php, mod_perl, etc. Tentei de novo e de novo, mas não pareceu funcionar. Eu li muitos fóruns e artigos sobre mod_gzip, e parece que esse problema deverá ser resolvido na próxima versão do mod_gzip (provavelmente 1.3.14.6f). Até então, podemos usar mod_gzip nas partes estáticas do site.
No entanto, às vezes não queremos compactar o conteúdo dinâmico, então devemos encontrar outras maneiras. Uma maneira é usar class.gzip_encode.php, que é uma classe PHP que pode ser usada para compactar o conteúdo da página chamando certas funções da classe no início e no final do script PHP. Se você deseja implementar esta solução no nível do site, você pode chamar essas funções das diretivas auto_prepend e auto_append no arquivo php.ini. Embora esse método seja eficaz, sem dúvida traz mais sobrecarga para sites de alta carga. Para obter instruções detalhadas sobre como usar esta classe, consulte seu código-fonte. A descrição do código-fonte é bastante completa e o autor conta tudo o que você precisa saber.
O PHP 4.0.4 possui um novo manipulador de cache de saída ob_gzhandler, que é semelhante à classe anterior, mas tem uso diferente. O seguinte conteúdo deve ser adicionado ao php.ini ao usar ob_gzhandler:
output_handler = ob_gzhandler;
Esta linha de código faz com que o PHP ative o cache de saída e comprima tudo o que envia. Se por algum motivo você não quiser adicionar esta linha de código ao php.ini, você também pode alterar o comportamento padrão do servidor (sem compactação) através do arquivo .htaccess no diretório onde o arquivo fonte do PHP está localizado. é o seguinte:
php_value output_handler ob_gzhandler
Ou chame-o a partir do código PHP, como segue: ob_start("ob_gzhandler");
O método de usar identificadores de cache de saída é realmente muito eficaz e não impõe nenhuma carga especial ao servidor. No entanto, deve-se observar que o Netscape Communicator tem suporte insuficiente para gráficos compactados; portanto, a menos que você possa garantir que todos os usuários usem o navegador IE, você deve desativar os gráficos JPEG e GIF compactados. Em geral, essa compactação funciona para todos os outros arquivos, mas é recomendável testá-la separadamente para cada navegador, especialmente se você usar plug-ins especiais ou visualizadores de dados. Isso é especialmente importante.