Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diogo Camargo

Quando a atualização do cache se torna o problema?

Recommended Posts

Como vai pessoal.

Sempre uso cache do tipo file por conta de host compartilhado que não da suporte para outros, eu uso cache em dois níveis, um para DB, esse oferece uma interface para substituir completamente o banco no caso de consulta e as vezes update, o outro nível é o cache de página para cache do nível da view para baixo, mas deixei rodar um controller global e models no topo da chamada do servidor sem cache, o cache de página afeta apenas as ações das views.

 

Chegou uma hora que as ações ler/atualizar do cache de página estava consumindo mais do que se eu deixasse rodar o PHP puro e apenas com o cache do banco.

O que vocês acham de remover e deixar apenas o do banco?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei bem que cache de pagina vc está usando, mas vc pode usar um sistema parecido com o do Wordpress que ao acessar um post dele ele cria um arquivo HTML com todo o conteúdo e salva, ai quando o usuário vai acessar a pagina ele simplesmente manda o HTML que já está pronto, ou seja, não é necessário processamento nenhum.

 

Para cache de BD eu conheço duas maneira, um é ativar o cache no próprio banco de dados (tem de ter muito cuidado nessa hora), outra é usar sistema como o do Memcached que é muitoooooooooooo mais rápido que o banco de dados e que cache em arquivo pois as coisas dele fica armazenadas na Memoria. Também veja sobre APC e outros caches de arquivo. Também veja alguns frameworks mais rápidos como http://phalconphp.com/pt/ e http://hhvm.com/. E por ultimo use um sistema de Load balancing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei bem que cache de pagina você está usando, mas você pode usar um sistema parecido com o do WordPress

 

No caso do WordPress, o post dificilmente é modificado, com isso, é vantajoso, no meu caso estou com muitas atualizações, updates/deletes/inserts em intervalos curtos, tornando o uso do cache por si só um problema.

Quanto a outras opções de cache, como disse anteriormente, não é possível em servidores compartilhados.

 

Uma boa solução seria Cassandra (DB), mesmo sendo mais rápido para consultas do que para outros, mas novamente é complicado por conta dos hosts.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja isso, pois você pode pedir para a empresa de hospedagem liberar essa parte, até pq é vantajoso pra ele que o sistema rode mais rapido

 

Outra coisa é que o MySQL tem um sistema de tabela que as coisas são armazenados em Memoria, acho q vc poderia testar ele, caso não tenha nenhuma outra solução:

http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ExtremsX

 

Na verdade minha preocupação não é o banco de dados, ela tende para próprio PHP em si.

 

O grande problema real é quando você tem iterar muitos resultados e no PHP 5.3 isso ainda é um problema que pode ser agora contornado com generators, mas ficar reiterando resultados o tempo todo ninguém quer, por isso um cache de página.

No meu caso, meu sistema está tendo que atualizar o cache muitas vezes que faz com que teremos agora dois problemas, o cache atualizando e salvando e os iterators.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É melhor ser mais profissional e deixar de usar hosts compartilhados, se a desculpa é o preço, a Amazon lhe oferece um servidor gratuitamente por um ano, com algumas limitações obviamente, mas não corre o risco de ter uma conta suspensa, por utilizar recursos extras de um servidor compartilhado, e nem ficar esperando alguém fazer uma cagada na outra ponta, infelizmente é o que mais acontece.



Após um ano achar caro o preço, ai é melhor rever o modelo de negócio.


Compartilhar este post


Link para o post
Compartilhar em outros sites

É melhor ser mais profissional

 

Fiquei decepcionado com sua forma de colocar.

Eu iria perguntar quem é vc, mas, para ser mais educado, prefiro editar o post e dizer que um fórum vazio não serve pra nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quem sou eu, sou um cara que estuda muito e tenho diversos projetos começado do Zero, e com muitos acessos e consultas, mesmo que um leve 90 dias para começar a receber tráfego, jamais contrato um compartilhado, pois sei que um servidor compartilhado, terei problemas com cache, consultas, inode, SEO, suporte, etc etc etc. E eu não quero isso para mim e nem para meu cliente.

http://php.net/manual/pt_BR/book.apc.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Williams

 

Tudo bem, nem esquenta,

sobre a Amazon, eu gosto muito, mas não sei porque, sempre fico com medo de ir para empresas que não trabalham com o "The Planet". Eles estão nessa brincadeira de servidores dedicados a muitos anos, me sinto mais confortável para contratar um plano dedicado juntamente com empresas que trabalham com o the planet.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diogo, não consigo pensar em outra maneira alem de usar Mencached ou outro parecido juntamente com o cache pra PHP. Se não der nenhum desses, e precisar realmente ficar nos arquivos (que é muito lento) tente ir pra uma hospedagem SSD rápida pelo menos. Se não poste aqui quais os Plugins disponíveis no seu servidor

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não poste aqui quais os Plugins disponíveis no seu servidor

 

Uso apenas cache de arquivo, eu pensei na classe mais objetiva e rápida que eu poderia desenvolver para tratar o cache de arquivo, por que isso? Por que não tenho dinheiro para pagar 500 paus por mês em um dedicado.

 

Um sistema de cache pode ser feito com Factory Method ou com Abstract Factory, fiz esta classe abaixo para tratar exclusivamente de cache de arquivo.

<?php

namespace [NameSpace ocutado];

use SplFileInfo;
use RuntimeException;
use UnexpectedValueException;
use [NameSpace ocutado]\[Vendor ocutado];

class Cacher
{
    private $path;
    
    private $filename;
    
    private $content = '';
    
    private $ttl = 10;
    
    private $file = '';
    
    private $ext = 'php';
    
    private $defaultTimezone = false;
    
    private $fileinfo = false;
    
    private $silentErrors = false;
    
    const STRING_DATA = 1;
    
    const ARRAY_DATA = 2;
    
    const OBJECT_DATA = 3;
    
    const SERIALIZED_DATA = 4;
    
    const UNDEFINED_DATA = 5;
    
    const INVALID_DATA = -1;
    
    public function __construct($path = '', $filename = '', $content = '')
    {
        $this->setPath($path);
        $this->filename($filename);
        $this->addContent($content);
        $this->ttl($this->ttl);
        $this->defaultTimezone = date_default_timezone_get();
        
        // Setar o timezone para UTC
        if ($this->defaultTimezone != 'UTC') {
            date_default_timezone_set('UTC');
        }
    }
    
    public function addContent($content)
    {
        $this->content = $content;
    }
    
    public function setFileInfo()
    {
        $this->file = rtrim($this->path, '/') . '/' . $this->filename . '.' . $this->ext;
        $this->fileinfo = new SplFileInfo($this->file);
        
        // O arquivo ainda não existe, será criado um novo
        if (!$this->fileinfo->isFile()) {
            return false;
        }
        
        $this->file = $this->fileinfo->getRealPath();
        
        // impede que o conteúdo seja exibido e força o update do cache sem remover o arquivo
        if ($this->expired()) {
            return false;
        }
        
        return $this->fileinfo;
    }
    
    public function exists()
    {
        return $this->fileinfo->isFile();
    }
    
    public function ready()
    {
        return $this->setFileInfo();
    }
    
    public function filename($filename = null)
    {
        if ($filename === null) {
            return $this->filename;
        }
        $this->filename = $filename;
    }
    
    public function ext($ext)
    {
        $this->ext = $ext;
    }
    
    public function setPath($path)
    {
        $this->path = $path;
    }
    
    public function ttl($ttl)
    {
        if ($this->ttl === 0) {
            $this->ttl = 0;
            return;
        }
        $this->ttl = ($ttl*60);
    }
    
    public function start()
    {
        ob_start();
    }
    
    public function isSerialized()
    {
        if (!is_string($this->content)) {
            return false;
        }
        $this->content = trim($this->content);
        
        $lastchr = substr($this->content, -1);
        
        if ($this->content === 'b:0;') {
            return true;
        }
        elseif (strlen($this->content) < 4) {
            return false;
        }
        elseif (':' !== $this->content[1]) {
            return false;
        } 
        elseif (';' !== $lastchr && '}' !== $lastchr) {
            return false;
        }
        return true;
    }
    
    public function end()
    {
        $this->addContent(ob_get_contents());
    }
    
    public function flush()
    {
        ob_end_flush();
        flush();
    }
    
    public function expired()
    {
        if (!$this->ttl) {
            return false;
        }
        return (($this->fileinfo->getMTime() + $this->ttl) < time());
    }
    
    public function checkFileInfo()
    {
        return ($this->fileinfo instanceof SplFileInfo);
    }
    
    public function remove()
    {
        if (!$this->ready()) {
            throw new RuntimeException('<strong>Cache error:</strong> O arquivo não está pronto!');
        }
        
        return $this->delete();
    }
    
    public function delete()
    {
        return @unlink($this->file);
    }
    
    public static function minify($content)
    {
        $search = array('/\>[^\S ]+/s', '/[^\S ]+\</s', '/\s{2,}/s');
        $replace = array('>', '<', ' ');
        return preg_replace($search, $replace, $content);
    }
    
    public function compress()
    {
        $this->content = static::minify($this->content);
    }
    
    public function prepare($datatype)
    {
        if ($datatype) {
            if ($datatype === self::UNDEFINED_DATA) {
                $datatype = $this->getDataType();
            }
            
            switch ($datatype) {
                case self::ARRAY_DATA:
                case self::OBJECT_DATA:
                    $this->content = serialize($this->content);
                    break;
                    
                case self::SERIALIZED_DATA:
                    $this->content = unserialize($this->content);
                    break;
            }
        }
    }
    
    public function getDataType()
    {
        if (is_array($this->content)) {
            return Cacher::ARRAY_DATA;
        }
        elseif ($this->isSerialized()) {
            return Cacher::SERIALIZED_DATA;
        }
        elseif (is_string($this->content)) {
            return Cacher::STRING_DATA;
        }
        else {
            return 0;
        }
    }
    
    public function store($datatype = self::STRING_DATA)
    {
        $this->prepare($datatype);
        [Vendor ocutado]::fileput($this->content, $this->file);
        return $this->content;
    }
    public function get($datatype = 0)
    {
        if (!$content = [Vendor ocutado]::fileget($this->file)) {
            return false;
        }
        $this->addContent($content);
        $this->prepare($datatype);
        return $this->content;
    }
    
    public function import($stop = true)
    {
        include $this->file;
        if ($stop) {
            exit;
        }
    }
    
    public function __destruct()
    {
        if ($this->defaultTimezone !== false) {
            if ($this->defaultTimezone != 'UTC') {
                date_default_timezone_set($this->defaultTimezone);
            }
        }
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não precisa pagar 500 paus, existem VPS apartir de 5 dolares, ou você pode comprar um VPS com uma boa memoria RAM pra hospedar um Memcached por exemplo.

 

Só lembrando a coisa mais lenta em qualquer linguagem de programação é o IO e delas mexer com arquivo deve ser uma das mais lentas (SSD ta mudando isso de pouco a pouco). E delas acho que gravar em arquivo é mais lento ainda.

 

Tente ir pra uma hospedagem com SSD que isso vai ficar mais rapido.

 

Ah sim, vc disse que o DB não é lento, tente criar uma tabela do tipo MEMORY e use como cache.

http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não precisa pagar 500 paus, existem VPS apartir de 5 dolares

 

Ir para VPS apenas no caso de crescimento a longo prazo, do contrário será dor de cabeça.

 

No meu caso prefiro esperar e ir direto para um dedicado.

A HG tem um plano dedicado de R$ 450

 

Intel Xeon Dual Core, 2.3GHz (4 threads)

500 GB RAID-1 Disco Rígido

4 GB de Memória DDR3

100 Mbps Uplink

10 TB de Tráfego Mensal

2 IPs Dedicados

cPanel Gratuito

 

Eu compraria este.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.