WillWeb 0 Denunciar post Postado Outubro 21, 2010 cache.class.php class Cache { /** * Tempo padrão de cache * * @var string */ // 1 week 2 days 4 hours 2 seconds var $time = '5 minutes'; /** * Local onde o cache será salvo * * Definido pelo construtor * * @var string */ var $folder = "cache"; /** * Construtor * * Inicializa a classe e permite a definição de onde os arquivos * serão salvos. Se o parâmetro $folder for ignorado o local dos * arquivos temporários do sistema operacional será usado * * @uses Cache::setFolder() Para definir o local dos arquivos de cache * * @param string $folder Local para salvar os arquivos de cache (opcional) * * @return void */ public function __construct() { $this->setFolder(!is_null($this->folder) ? $this->folder : sys_get_temp_dir()); } /** * Define onde os arquivos de cache serão salvos * * Irá verificar se a pasta existe e pode ser escrita, caso contrário * uma mensagem de erro será exibida * * @param string $folder Local para salvar os arquivos de cache (opcional) * * @return void */ public function setFolder($folder) { // Se a pasta existir, for uma pasta e puder ser escrita if (file_exists($folder) && is_dir($folder) && is_writable($folder)) { $this->folder = $folder; } else { trigger_error('Não foi possível acessar a pasta de cache', E_USER_ERROR); } } /** * Gera o local do arquivo de cache baseado na chave passada * * @param string $key Uma chave para identificar o arquivo * * @return string Local do arquivo de cache */ public function generateFileLocation($key) { return $this->folder . DIRECTORY_SEPARATOR . $this->generateFileName($key) . '.tmp'; } public function generateFileName($key) { return md5($key); } /** * Cria um arquivo de cache * * @uses Cache::generateFileLocation() para gerar o local do arquivo de cache * * @param string $key Uma chave para identificar o arquivo * @param string $content Conteúdo do arquivo de cache * * @return boolean Se o arquivo foi criado */ protected function createCacheFile($key, $content) { // Gera o nome do arquivo $filename = $this->generateFileLocation($key); // Cria o arquivo com o conteúdo return file_put_contents($filename, $content) OR trigger_error('Não foi possível criar o arquivo de cache', E_USER_ERROR); } /** * Salva um valor no cache * * @uses Cache::createCacheFile() para criar o arquivo com o cache * * @param string $key Uma chave para identificar o valor cacheado * @param mixed $content Conteúdo/variável a ser salvo(a) no cache * @param string $time Quanto tempo até o cache expirar (opcional) * * @return boolean Se o cache foi salvo */ public function save($key, $content, $time = null) { $time = strtotime(!is_null($time) ? $time : self::$time); $content = serialize(array( 'expires' => $time, 'content' => $content)); return $this->createCacheFile($key, $content); } /** * Salva um valor do cache * * @uses Cache::generateFileLocation() para gerar o local do arquivo de cache * * @param string $key Uma chave para identificar o valor cacheado * * @return mixed Se o cache foi encontrado retorna o seu valor, caso contrário retorna NULL */ public function read($key) { $filename = $this->generateFileLocation($key); if (file_exists($filename) && is_readable($filename)) { $cache = unserialize(file_get_contents($filename)); if ($cache['expires'] > time()) { return $cache['content']; } else { unlink($filename); } } return null; } } require_once("cache.class.php"); class MySQL { var $conectado; var $servidor; var $usuario; var $senha; var $banco; var $cache; public function __construct($servidor,$usuario,$senha,$banco){ $this->servidor = $servidor; $this->usuario = $usuario; $this->senha = $senha; $this->banco = $banco; $this->cache = new Cache(); } public function desconectar(){ $this->conectado = false; return mysql_close(); } private function conecta(){ echo "conecto"; $this->conectado=mysql_connect($this->servidor,$this->usuario,$this->senha); if(!$this->conectado){ $this->geraLog("Falha na conexão com o Banco de Dados!"); }elseif(!mysql_select_db($this->banco)){ $this->geraLog("O Bando de Dados solicitado não pode ser aberto!"); } } //Esta função executa uma Query, esta funcao SEMPRE IRÁ RETORNAR UMA ARRAY. public function mysql_query($sql, $time = null){ $key = $this->cache->generateFileName($sql); $ret = $this->cache->read($key); if (!$ret) { if(!$this->conectado){ $this->conecta(); } $ret = array(); $query = mysql_query($sql); if($query){ while ($dados = mysql_fetch_assoc($query)) { $ret[] = $dados; } $this->mysql_free_result($query); $this->cache->save($key, $ret, (is_null($time) ? $this->cache->time : $time)); }else{ $this->geraLog("Ocorreu um erro na execução da SQL"); } } return $ret; } private function geraLog($erro){ $aux = date("d/m/Y") . " | "; $aux .= date("H:i:s") . " | "; $aux .= mysql_error() . " | "; $aux .= $erro; $aux .= "\r\n"; error_log($aux, 3, "c:\my-errors.log"); echo $aux; } public function mysql_num_rows( $query ) { if (@is_array($query)){ return count($query); }else{ return mysql_num_rows( $query ); } } public function mysql_free_result($sql){ return mysql_free_result($sql); } public function mysql_fetch_assoc($seila) { global $queryCache; if (count($queryCache)>0){ foreach ($queryCache as $j=>$i){ unset($queryCache[$j]); return $i; } } } } $mySQL = new MySQL("localhost","usuario","senha","mysql"); //$arr = new ArrayObject(); $sql = "SELECT * FROM user;"; $queryCache = $mySQL->mysql_query($sql); $total = $mySQL->mysql_num_rows($queryCache); while ($dados = $mySQL->mysql_fetch_assoc($queryCache)){ print_r($dados); } Seguinte, acima existem 2 classes, uma que grava uma array em cache, retorna o que está em cache em forma de array,... A outra classe faz a conexão com o banco e verifica se a consulta está em cache, se tiver retorna uma array com os registros da consulta. O PROBLEMA É QUE, USANDO A MINHA LÓGICA O mysql_query SEMPRE TERÁ QUE RETORNAR O VALOR PARA A VARIAVEL COM O NOME "$queryCache", pois no mysql_fetch_assoc a variável "$queryCache" está declarada como global, eu gostaria que essa situação não acontecesse. Acho que não expliquei direito, caso alguem não tenha entendido poste aqui sua dúvida. Compartilhar este post Link para o post Compartilhar em outros sites
nb-master 0 Denunciar post Postado Outubro 22, 2010 Boa Noite O ideal não seria um cache via Mysql? Compartilhar este post Link para o post Compartilhar em outros sites
WillWeb 0 Denunciar post Postado Outubro 22, 2010 Não sei, no meu caso eu tenho um serviço de hospedagem e esse serviço me informou que meu site está consumindo muitos recursos do servidor. ai eu tenho que fazer alguma coisa para diminuir isso... Não sei si a melhor maneira é usar esse sistema de cache ou um cache via Mysql... Alguem já precisou fazer isso ? Compartilhar este post Link para o post Compartilhar em outros sites
André Severino 3 Denunciar post Postado Outubro 22, 2010 Você está usando os limites impostos pelo seu plano de hospedagem ? ? ? Se sim, fu$#$####@@## os cara e fica sussa Compartilhar este post Link para o post Compartilhar em outros sites
nb-master 0 Denunciar post Postado Outubro 22, 2010 rsrs Bom cara ai vai variar muito do admin do servidor de sua hospedagem eu tenho servidor por exemplo que tem 1GB de RAM só para cache do Mysql, da uma melhora significativa para consultas Mysql. Usando um Array fica meio que difícil quando precisar manipular os dados, pois tipo para deixar leve o servidor teria que ser feito 1 consulta com todos os dados, enviar para o array e depois manipular esse array. Mais imagina agora se você só precisa de 1 linha de uma certa tabela? Vai ter que fazer um select de tudo manipular o array e depois atualizar o array no banco/ na verdade pelo ID do registro. Traduzindo, procura outra hospedagem que posso lhe dar mais segurança com relação do Mysql =) ou ainda um servidor VPS apenas para mysql caso seje uma aplicação um pouco mais robusta. Compartilhar este post Link para o post Compartilhar em outros sites
André Severino 3 Denunciar post Postado Outubro 22, 2010 É cara, que tipo de servidor de hospedagem reclama de uma aplicação, motherfu#$#$3$@#@@##WS#, você alugou o serviço em uma quitanda? Ou você usa a quantidade imposta pelo seu plano,ou não? Caso tiver dando problema e você estiver consumindo banda d+ ou precisar de mais um banco e etc... ae contrata um plano um pouco + caro com seus beneficios. Agora o pessoal do suporte reclamar do cache do seu banco? pqp ^_^ Compartilhar este post Link para o post Compartilhar em outros sites
WillWeb 0 Denunciar post Postado Outubro 22, 2010 Abaixo segue o email que recebi da equipe Abuse da UOLHOST. Prezado cliente, Conforme verificação de nosso departamento técnico, e nosso monitoramento realizado em nossos servidores, para garantir a qualidade do serviço contratado, identificamos que seu plano de hospedagem, que responde pelo domínio www.mp3wm.com , e login xx@xx.com , está consumindo muitos recursos do servidor, causando problemas ao servidor de hospedagem, e aos demais clientes que usam a mesma plataforma compartilhada. Dessa forma, sua aplicação não encontra-se mais compatível com o atual ambiente compartilhado em que foi configurada, fazendo-se necessária a migração para um ambiente dedicado. É importante que nos indique um telefone de contato e o nome da pessoa com quem nossa área Comercial possa conversar, para viabilizar essa atualização de serviço. Lembramos que, sem esse upgrade não poderemos continuar oferecendo os serviços já contratados. Aguardamos o seu contato, Att, Não tenho condições de adquirir outro serviço, tipo um VPS ou um Cloud Computing, alguem tem alguma sugestão??? o meu site é mp3wm.com Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 22, 2010 o teu site tem qntas visitas diárias ? qual é o tráfego diário? e o consumo de banda ? a aplicação foi bem escrita? está usando coisas como _pconnect() ? Compartilhar este post Link para o post Compartilhar em outros sites
WillWeb 0 Denunciar post Postado Outubro 22, 2010 Nas estatísticas do adsense ontem ele teve 10,500 visitas... No link abaixo tem o número de usuários online no momento. http://whos.amung.us/stats/oxos7lr7lkua/ A aplicação foi feita por mim, sei que da pra melhora em muito ela, mas acredito que não irá mudar muito na questão da perfomance. Não tem nada com pconnect... Compartilhar este post Link para o post Compartilhar em outros sites
nb-master 0 Denunciar post Postado Outubro 22, 2010 Bom tem um bom fluxo de dados, recomendo tentar outro servidor de hospedagem e caso não consiga ai sim repense em ver sua aplicação! Compartilhar este post Link para o post Compartilhar em outros sites
André Severino 3 Denunciar post Postado Outubro 23, 2010 Cara com 10k de visitas diárias, você quer hospedar ele em uma hospedagem? Contrata um serviço de hospedagem por ex.: Essas revendas e use apenas para seu site você paga 200 reais mensais e boa Compartilhar este post Link para o post Compartilhar em outros sites
WillWeb 0 Denunciar post Postado Outubro 23, 2010 Ok, vou contratar outra hospedagem, mas mesmo assim se eu quiser usar modo de cache em arquivos como no exemplo que eu mandei, será que irá diminuir o uso da perfomance dos servidor??? ou é melhor o cache do mysql ?? Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 WillWeb, pelo que vi o que está fazendo em seu site é ilegal! Sugiro que tome cuidado e que revise o que está fazendo! E também revise o termo de serviço da empresa que hospeda esse seu site, pois pode ser que eles não aceitem esse "tipo" de hospedagem! Compartilhar este post Link para o post Compartilhar em outros sites
André Severino 3 Denunciar post Postado Outubro 26, 2010 Use o do mysql mesmo para que se preocupar com scripts. Bom acredito que não vai mudar 'muito', acho melhor você contratar um plano de revenda e verifique a quantidade de banda que eles oferecem mensalmente se for melhor do que aqueles planos vip's dos serviços de hospedagem. abraça e sai p/ o beijo ^_^ Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Outubro 26, 2010 Pelo tipo de serviço e conteúdo que seu site oferece um cache de páginas pode resolver seu problema. Uma opção: http://pear.php.net/package/Cache_Lite Compartilhar este post Link para o post Compartilhar em outros sites