Jump to content

Diogo Camargo

Members
  • Content count

    89
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by Diogo Camargo

  1. Diogo Camargo

    Extends OOP

    Uma classe para conexão não deve conhecer qual é o banco e nem mesmo suas configurações Você precisa de uma interface. Podem existir muitas classes de conexão, mas para serem responsaveis por bancos diferentes e apenas uma interface para ser utilizada por estas classes. Exemplo: Interface AbstractConnectorConfig __construct($host, $user, $password [,...] Abstração de bancos de dados: MySqlConnector extends AbstractConnectorConfig PostgreSQLConnector extends AbstractConnectorConfig
  2. Diogo Camargo

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

    Vou olhar, obrigado Dedas.
  3. 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?
  4. Diogo Camargo

    Limpar parte da URL

    <?php $parse = parse_url('http://www.site.com.br/novo/includes/valorCalculo.php? imovel=1176&dataEntrada=19-01-2015&dataSaida=02-02-2015&..........', PHP_URL_QUERY); $parse_str = parse_str($parse, $result); $url = 'http://www.site.com.br/novo/includes/valorCalculo.php?imovel=' . $parse_str['imovel'];
  5. Diogo Camargo

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

    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.
  6. Diogo Camargo

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

    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); } } } }
  7. Diogo Camargo

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

    @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.
  8. Diogo Camargo

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

    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.
  9. Diogo Camargo

    SET click em DIV

    O que faz um vídeo do YouTube carregar automaticamente é o parâmetro autoplay=1 Ao clicar na imagem do vídeo, você pode usar jQuery para substituir. <a href="#" class="replaceVideoImage" data-video-id="{VIDEO_ID}"> <!-- default, hqdefault, mqdefault --> <img src="http://img.youtube.com/vi/{VIDEO_ID}/hqdefault.jpg" class="videoImage videoImage{VIDEO_ID}" /> </a> <script> // Exemplo $('body').on('click', '.replaceVideoImage', function(e) { var id = $(this).data('video-id'); $('.videoImage' + id).replaceWith('<iframe src="//www.youtube.com/embed/'+ id +'?autoplay=1"></iframe>'); e.preventDefault(); }); </script>
  10. Diogo Camargo

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

    @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.
  11. Diogo Camargo

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

    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.
  12. Diogo Camargo

    menu fixed na esquerda e conteudo float left?

    Uma dica é evitar esses nomes de classes/id como left, right, top, bottom imagine se em algum momento você quiser que o está na esquerda fique a direita Adicione "position relative" left 305px e quando fechar adicione um atributo style com left:0
  13. Diogo Camargo

    Como proteger $variável contra "require" externo?

    Ainda é cedo para usar password_hash quase todos os hosts compartilhados ainda estão no PHP 5.3, o exemplo acima é compatível, ou seja, password_hash da suporte para crypt, deixando-nos aliviados em continuar usando crypt até que estejamos seguros de que o PHP 5.5 está em uso geral.
  14. Diogo Camargo

    Como proteger $variável contra "require" externo?

    MD5 não foi criado para criptografia $password = '123'; $salt_length = 16; $salt_prefix = '2a'; /** * Proteção contra milhões de tentativas */ $cost = '08'; $salt = strtr( base64_encode( mcrypt_create_iv($salt_length, MCRYPT_DEV_URANDOM) ), '+', '.'); $salt = str_replace('=', null, $salt); $hash = crypt($password, '$'. $salt_prefix .'$' . $cost . '$' . $salt . '$'); Salve $hash em um banco de dados ou como vc não sabe trabalhar com bancos, faça um teste salvando até mesmo neste seu arquivo senha.php Para testar é muito simples if (crypt($password, $hash) == $hash) { // Senha correta }
  15. Diogo Camargo

    Como proteger $variável contra "require" externo?

    É também uma questão de "inteligência" saber que o PHP é executado no servidor, por isso, é impossível ver variáveis no navegador. Não é o armazenamento o problema e sim a criptografia php.net/crypt
  16. Diogo Camargo

    Adicionar muito conteúdo a variável

    "HTML no meio do PHP" não é mesmo uma boa ideia, mas "PHP no meio do HTML" está correto desde que obedeça alguns princípios de separação do core, model, controller etc, se você observar uma "View", ela possuir a responsabilidade de passar informações para o template, como vai pegar as informações se não for com PHP no meio do HTML.
  17. Diogo Camargo

    Como proteger $variável contra "require" externo?

    Você está com uma visão completamente distorcida em relação a proteção de dados.
  18. Diogo Camargo

    Redirecionar Todas as Requisições para index.php

    RewriteRule (.*) /$1 [NC,QSA]
  19. Diogo Camargo

    Upload de imagens e organização dessas.

    Não é com POST e sim com FILE Precisa colocar enctype no form <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="image" /> </form> Estude sobre upload em PHP e os valores contidos em $_FILE <?php if (!isset($_FILE['image'])) { /* A imagem não foi enviada */ } $image = $_FILE['image']; if ($image['size'] > 1603037) { /* Imagem muito grande! */ } /** * Pode mudar o padrão para '<image/.*>i' */ elseif (!preg_match('<image/(\bj(peg|pe|pg)\b|png|gif)>i', $file['type'])) { /* Tentativa de enviar um arquivo que não é uma imagem */ } /** * Pode usar outros meios para abrir a imagem */ $image_contents = file_get_contents($image['tmp_name']); /** * Proteção contra XSS */ if (preg_match( "#<script|<html|<head|<title|<body|<pre|<table|<a\s+href|<img|<plaintext|<cross\-domain\-policy#si", $image_contents)) { /* Possível tentativa de ataque */ }
  20. Diogo Camargo

    Gostaria de postar artigos sobre PHP

    Fala pessoal, tenho um problema de ficar com quilos de conteúdo na minha cabeça apenas pra mim, gostaria de um sub fórum de artigos em PHP para postarmos matérias e enriquecer o fórum, não se trata de postar código, isso já existe muito, mas falar de coisas que afetam o dia a dia do programador e claro, colocar exemplos quando for cabível. Apenas respondendo, ficamos muito limitados e definitivamente não da pra postar um artigo como se fosse um novo tópico.
  21. Diogo Camargo

    conexão mySql funciona no PC mas não funciona na internet

    Um simples espaço \s no início do arquivo já seria suficiente para produzir este erro, outro detalhe é que se estiver usando UTF-8 deve tirar o BOM
  22. Diogo Camargo

    Gostaria de postar artigos sobre PHP

    Os calouros ficam postando perguntas quando não é o lugar correto, mas acredito que não é problema, nesse caso bastaria um moderador mover a pergunta para o lugar correto. Um sistema de blogs é ótimo porque permite que apenas o dono escreva e impede perguntas no lugar errado.
  23. Diogo Camargo

    Não permitir cópia do htdocs

    Se for com senha, sem chance!
  24. Diogo Camargo

    Não permitir cópia do htdocs

    Você está no (1) Windows Server? Ou está falando de um (2) desktop que outros usam. Um sistema operacional foi criado pra ser gerenciável, quer dizer que você pode fazer isso que deseja no linux e no Windows.
  25. Diogo Camargo

    retornar mensagem na tela, em determinado lugar com PDO

    Esse trecho com endif; está sendo usado de forma incorreta e sem necessidade. O endif foi criado para outro proposito, veja. <div class="endif-example"> <?php if ($stm->rowCount()): ?> <div>cadastrado com sucesso</div> <?php endif; ?> </div> O uso de end(if|foreach|while) foi criado para que possamos separar corretamente o PHP da linguagem de marcação. Escrever HTML com PHP pode dar dores de cabeça com atributos e outros // Não é necessário if ($stm->rowCount() == true): // Apenas if ($stm->rowCount()):
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.