Hoje é dia de notícias antipáticas. Infelizmente.
O shopping virtual para o programa MercadoSócios, do Mercado Livre, provido pelo site Nerdown fica a partir desse momento proibido aqui na PortoFácil, devido ao absurdo consumo de CPU e banda que ele ocasiona, afetando todas as contas hospedadas no servidor.
A razão para isso é simples: os autores do script popularizado pelo Nerdown não se preocupam com performance, vai ver no México processador e largura de banda são de graça. Cada página do referido shopping faz várias requisições pesadas de HTTP ao servidor do Mercado Livre, para buscar o XML dos produtos e categorias, e para buscar o HTML das páginas dos produtos.
Porém, nem tudo está perdido.
Para viabilizar que este shopping possa ser rodado em nossos servidores fiz um pequeno hack que permite que as requisições HTTP fiquem em cache, diminuindo muito (mesmo) a carga no servidor.
Os passos para implementar este hack são os seguintes:
- Criar um diretório cache dentro do diretório do shopping.
- Modificar o arquivo config.php para incluir o código responsável pela criação do cache (abaixo mais detalhes).
- Modificar cada arquivo do shopping em que seja feita uma chamada para fopen(), inserindo uma chamada à função de criação do cache.
Abaixo, a listagem da função FazCache(), que recebe como parâmetro uma URL e retorna como resultado o nome do arquivo de cache com o conteúdo da requisição. Utilizei um método simples para evitar a utilização de bancos de dados, que ainda está experimental, que consiste em criar o arquivo de cache com o hash MD5 da URL, garantindo que cada nome de arquivo de cache será relativo a uma e somente uma URL possível. Caso o arquivo não exista, ou caso ele exista mas seja mais antigo do que 24h será forçada a criação do arquivo, com a respectiva requisição a partir do servidor do Mercado Livre.
function FazCache($url){
$ForcarCriacao = false;
$MD5 = md5($url);
$NomeArq = "cache/$MD5.html";
if (!file_exists($NomeArq)) {
$ForcarCriacao = true;
}
else {
$Modif = filemtime($NomeArq);
$Agora = time();
if ($Agora > ($Modif + (24 * 60 * 60))){
$ForcarCriacao = true;
}
}
if ($ForcarCriacao){
if (file_exists($NomeArq)){
unlink($NomeArq);
}
$temp = file_get_contents($url);
file_put_contents($NomeArq, $temp);
}
return $NomeArq;
}
Observe que utilizamos aqui a função file_put_contents() do PHP5. Será necessário estar rodando essa versão do PHP para poder usar esse código, caso você não seja cliente da PortoFácil. Além disso, o fopen() tem que estar habilitado para abrir URLs. Futuramente farei uma implementação com CURL, mas devido a um bug irritante (ele não conseguia obter as páginas dos produtos, só o XML) acabei deixando com fopen() mesmo.
Note também que na linha onde se lê $NomeArq = “cache/$MD5.html”; o WordPress substitui as aspas simples por aspas inglesas. Quando colar o código no seu editor atente para este detalhe, substituindo manualmente os caracteres.
Feita a modificação no config.php é hora de abrir os demais arquivos .php em busca de chamadas à função fopen(), a fim de inserir a chamada à função de geração do cache.
Normalmente, o fopen() estará no seguinte formato:
$fp = fopen($url, "r");
Isso está dizendo ao PHP para abrir para leitura o endereço indicado pela variável $url. O que nós faremos será algo como:
$NomeArquivo = FazCache($url); $fp = fopen($NomeArquivo, "r");
Ou seja, ao invés de abrirmos $url diretamente, primeiro garantimos que uma versão dela vai estar no nosso cache, e em seguida abrimos o arquivo de cache para leitura, e não mais $url diretamente. Só isso.
Com essa modificação o consumo de CPU do shopping Nerdown foi reduzido em 93% pelo menos, sem perda de funcionalidade. A economia de banda é dificílima de calcular, mas estimo que esteja no mínimo no mesmo nível da economia de CPU.
Como eu disse acima, este código ainda é experimental, embora já torne viável a execução do referido shopping em nossos servidores. Os problemas conhecidos ou imagináveis são: a falta de uma rotina de limpeza do cache (ou seja, os arquivos vão se acumulando, ocupando espaço e entradas de diretório, demandando remoção automática de tempos em tempos) e possível performance devido ao fato de usarmos arquivos de texto para caching, e não banco de dados.
Comentários serão bem vindos.

Vai pra conta do liquidandotudo.com o mais rápido possível…
Abraço!
Se precisar de ajuda para implementar é só me chamar. Se bem que eu acho que as instruções ficaram bem claras, né…
Poxa, coloca o script alterado aí para download, pois pessoas como eu que são apenas webdesigner, possam ter o script alterado e assim subir pro servidor sem dificuldades…
O que acha?
Um forte abraço, Téo
Desculpe, Téo. O script completo é exclusividade dos clientes da PortoFácil.
Ótimo função já instalei no meu shopping, aumentei o tempo de atualização de cache para 5 dias, não tem sentido colocar 1 dia pelo fato que o MercadoLivre não se atualizar tão rápido assim
O grande problema são os arquivos de cache que estão acumulando, é nescessário criar uma rotina automatica para apagar arquivos de mais de 20 dias em cache
Poderia me ajudar com este script?
Obrigado espero resposta.
@Guigom: pelo que pude observar, você não é clienta da PortoFácil nem da Via Hospedagem. Dessa forma, não é ético eu fazer o trabalho que deve ser feito pelo suporte da sua hospedagem, entende?
Como ficaria para substituir CURL ?
Abraços
Solange, não entendi sua pergunta.
Também não consegui identificar seu cadastro como cliente da PortoFácil/Via Hospedagem. Por favor, abra um ticket na seção de Hospedagem, no site da Via, conforme o e-mail que todos os clientes receberam, e ajudaremos você com suas dúvidas.
Mas, por favor, dê mais detalhes para que saibamos do que precisa.
pô como os caras fazem uma coisa e naõ se preocupam cpom a perfomance