3l3tr1c 1 Denunciar post Postado Abril 3, 2012 E aí galera! Andei lendo sobre as formas de caching em PHP e os métodos utilizados por aí. Encontrei isso aqui, do Rasmus Ledorf: http://derickrethans.nl/errorhandling/rasmus-trick.html Problema: eu tenho um sistema onde os usuários cadastram clientes, visualizam e editam as informações de cada cliente cadastrado. A cada vez que as páginas de visualizar e editar são abertas é compilado o programa contido na página e depois de gerada a consulta a base de dados, os dados são renderizados pelo navegador. Mas imagine que eu tenha 100 usuários que cadastrem e visualizem constantemente os clientes, isso iria sobrecarregar meu "servidorzinho". Então, pensei no seguinte: toda vez que um cliente for cadastrado eu irei gerar um HTML com as informações já do banco de dados. Esse HTML será utilizado tanto para visualizar as informações desse cliente tanto para editar, se o usuário clica lá no final em editar, eu gero outro HTML com os dados modificados e sobrescrevo o anterior. Portanto, assim sendo eu acho que isso iria reduzir enormemente a sobrecarga do servidor. O que vocês acham disso, "de estatizar o dinamismo"? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Abril 3, 2012 Existem soluções de cache no MySQL bem mais eficientes... Compartilhar este post Link para o post Compartilhar em outros sites
3l3tr1c 1 Denunciar post Postado Abril 4, 2012 Sério? Poderia indicar um artigo ou texto que fale do assunto? Obrigado. Achei isso: http://phpbrasil.com/artigo/ujoo4P6IuP11/usando-o-sql_cache-para-melhorar-a-performance-do-mysql http://xoops.net.br/docs/mysql/manual/ch06s09.php#.T3uOI2Gi2So Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 4, 2012 Eu sinceramente não entendi o que ele quis dizer com CACHE no MySQL, mas definitivamente não é nada disso que você encontrou a respeito. O CACHE do MySQL nada tem haver com o CACHE de páginas. O que existe opcionalmente a utilização do disco seria utilizar, por exemplo, um NoSQL como o MemcacheDB, que armazena uma relação chave-valor e uma das principais operações para este é armazenar cache de páginas. Bem vamos aguardar novas opiniões. Compartilhar este post Link para o post Compartilhar em outros sites
Estud@nte 6 Denunciar post Postado Abril 4, 2012 Se você usa várias consultas ao mesmo tempo, SQL_CACHE ajuda, agora para criação de cache do html gerado, segue um exemplo prático de uso: <?php date_default_timezone_set('America/Sao_Paulo'); $path = "cache"; $cacheFile = $path . "/index.html"; $timeCache = 5 * 60; //Validade do Cache em Minutos if(file_exists($cacheFile) && ( time() - $timeCache < filemtime($cacheFile))){ include_once($cacheFile); die(); } ob_start(); ?> <html> <head> <title>Título da Página</title> <meta http-equiv="Content-type" content="text/html charset=UTF-8"/> </head> <body> <h1>Olá Mundo, horário atual: <?php echo date('g:i:s a'); ?></h1> <!-- CACHED PAGE - HORÁRIO : <?php echo date('g:i:s a'); ?> --> </body> </html> <?php $local = dirname(__FILE__); if(!is_dir($path)){ mkdir($local.'/'.$path.'/'); chmod($local.'/'.$path,0777); } else { if(!is_writable($local.'/'.$path)){ chmod($local.'/'.$path,0777); } } $fp = fopen($cacheFile,'w'); fwrite($fp, ob_get_contents()); fclose($fp); ob_end_flush(); ?> Compartilhar este post Link para o post Compartilhar em outros sites
3l3tr1c 1 Denunciar post Postado Abril 4, 2012 Percebi que são duas coisas distintas. Existe a programação que interage com o BD e essa "demora" para obter respostas, então cachea-se as consultas ao BD, já que essas serão recorrentes. A outra é como o Estud@nte disse. Mas a ideia de fazer o HTML do código dinâmico deve envolver pouca programação, pois esse é o objetivo, fazer com que o servidor se esforce pouco ao processar informações. O código dele transforma o que é dinâmico em estático, mas ainda assim tem muita programação, então seria equivalente a usar a página com a programação sem estatizar. Valeu pelas considerações! O MemcacheDB é um banco de dados ou uma solução para caching em banco de dados? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 4, 2012 3l3tr1c... Existem várias estratégias, a apresentada pelo Estud@nte me parece bastante razoável, com um pequeno cuidado com a questão de tempo de expiração do cache. Como já foi citado, você tem opções de onde vai armazenar o cache, sistema de arquivos ou um componente externo para guardar chave-valor, ambas as soluções funcionam muito bem, mas quanto a lógica, esta pode ser aplicada de várias maneiras e seguir N critérios distintos, inclusive que podem estar relacionado com a regra de negócio de cada aplicação (uma estratégia de cache pode atender muito bem determinada solução, mas pode não ser adequada em outras). Há também possibilidade de utilizar alguma coisa pronta, como o APC ( http://www.php.net/manual/pt_BR/book.apc.php ). O MemcacheDB é um sistema de armazenamento de objetos, isto inclui qualquer coisa, que seja referenciado por chave-valor. Não é uma solução específica para fazer cache de página, mas funciona muito bem para este propósito. Compartilhar este post Link para o post Compartilhar em outros sites
3l3tr1c 1 Denunciar post Postado Abril 4, 2012 Certo, mas como disse antes, agora percebo que são duas coisas distintas. Seria interessante fazer o cache das páginas e das consultas ao BD. Como eu posso usar o MemcashDB? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 4, 2012 Para usar o MemcacheDB você precisa ter acesso para instalar recursos no seu servidor ou o prestador de serviços oferecer como opção. Apenas lembrando que o cache de SQL também estará condicionado a configuração do SGBD no servidor. Compartilhar este post Link para o post Compartilhar em outros sites
3l3tr1c 1 Denunciar post Postado Abril 4, 2012 Para usar o MemcacheDB você precisa ter acesso para instalar recursos no seu servidor ou o prestador de serviços oferecer como opção. Apenas lembrando que o cache de SQL também estará condicionado a configuração do SGBD no servidor. Obrigado pelas dicas. Mas quando falo em usar, digo como eu opero ele, o que posso fazer tanto? Você tem algum material sobre isso para disponibilizar, por favor? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 4, 2012 Não encontrei exemplos de utilização do MemcacheDB com PHP, mas há vários exemplos da utilização do Memcached (não acredito que seja muito diferente, talvez a própria API sirva para ambos, mas não encontrei nada para confirmar). O MemcacheDB e o Memcached são basicamente a mesma coisa (o MemcacheDB é baseado no Memcached), com a diferença de que o armazenamento do Memcached é feito em memória, isto da um ganho absurdo de performance, porém, é mais limidado no que diz respeito a recurso disponível (espaço) para fazer o cache. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Abril 4, 2012 Algumas sugestões: Webserver Nginx para arquivos estáticos. Siga as sugestões da YSlow para maximizar o caching do lado do cliente. Na maioria das vezes o gargalo não é o PHP. Depois de se certificar que está servindo o mínimo de requisições possível, estude um sistema de template com suporte a caching. Sugiro Smarty 3 ou Twig. Você está certo ao querer fazer o mínimo possível de modificações no HTML, só precisamos estudar a forma mais eficiente de fazer isso. Nos seus output's HTML, marque duas fronteiras: o primeiro valor dinâmico impresso e o último. Tudo que vier antes dessa fronteira deverá ser despejado de forma crua na saída padrão e, em seguida, deverá ser feita a descarga do buffer. Dessa forma, enquanto o servidor processa os dados dinâmicos, o navegador já vai baixando os arquivos que não estão em cache além de efetuar os processamentos e cálculos pertinentes - leia-se JavaScript. O PHP possui duas diretivas chamadas auto_prepend_file e auto_append_file que são executadas a nível de core. Instale uma distribuição apache compilada com MPM-prefork Banco de dados Fazer um caching de consultas SQL será mais efetivo se você utilizar conexões persistentes compartilhadas e consultas preparadas. Estude também uma forma inteligente de montar índices que não dependam apenas da chave primária ou unicamente da coluna ID. Em tabelas com muitos registros não trabalhados pode ser feita uma view, contendo apenas os valores pertinentes. Em bancos extremamente grandes, considere montar clusters e/ou fazer particionamento do banco. Estude a possibilidade de instalar HD's SSD nos servidores de BD. PHP A extensão bcompiler está disponível via PECL e permite persistir os bytecodes do processamento PHP, tal qual os arquivos .class do Java. Pulamos a etapa de interpretação e ganhamos em performance (d)e processamento. Compartilhar este post Link para o post Compartilhar em outros sites
3l3tr1c 1 Denunciar post Postado Abril 8, 2012 Muito obrigado. Estou estudando os casos e se mais alguém puder colaborar será excelente! Compartilhar este post Link para o post Compartilhar em outros sites
Estud@nte 6 Denunciar post Postado Abril 8, 2012 Só quis ilustrar como fazer um cache de html para teste de inclusão após 5 minutos ou segundo se preferir, simples e funcional, não gosto de usar coisas prontas! Sobre o tempo de exclusão você pode tirar e fazer uma rotina qualquer, como apagar o cache antigo em updates e deletes. Eu já utilizei este sistema para cachear um guia de telefones nacional, com mais de 2 milhões de registros, só com o boot do Google. Não confie em servidores mesmo com alta performance, pois um simples erro em um dia, pode virar um estrago que dure semanas, se tiver milhões de visitas/mês, vindas de tráfego do Google. Mais básico ainda, uma vez processado o script não volta ao repositório. <?php $path = "cache"; $cacheFile = $path . "/index.html"; if(file_exists($cacheFile)){ include_once($cacheFile); die(); } ob_start(); ?> <html> <head> <title>Título da Página</title> <meta http-equiv="Content-type" content="text/html charset=UTF-8"/> </head> <body> <h1>Olá Mundo, horário atual: <?php echo date('g:i:s a'); ?></h1> </body> </html> <?php $fp = fopen($cacheFile,'w'); fwrite($fp, ob_get_contents()); fclose($fp); ob_end_flush(); ?> Ou de uma lida aqui cache com erro 404 http://blog.feliperibeiro.com/2008/12/caching-em-php-com-uma-tecnica-obscura-mas-muito-eficiente.html Compartilhar este post Link para o post Compartilhar em outros sites