Aumente a performance do seu site com cache .htaccess

Existem várias formas de se aumentar a performance de uma aplicação web, e quando eu falo aplicação web o mesmo se aplica a sites. Uma das formas mais eficientes de lidar com performance é concentrar esforços para aumentar a sensação de carregamento instantâneo da sua aplicação.

Steve Souders escreveu um livro excelente chamado: High Performance Websites e nele, Steve, falou algo que me chamou muita atenção:

“Na maior parte da minha carreira em Internet, fui engenheiro de back-end. Como tal, eu diligentemente atacava cada projeto de performance como um exercício em otimização de back-end, me concentrando em opções de compilação, índices de bases de dados, gerenciamento de memória, etc. Existe muita atenção e vários livros dedicados a otimização performance nessas áreas, então é nelas que a maioria das pessoas emprega seu tempo, procurando melhorias. Na realidade, para a maioria das páginas de Internet, menos de 10% a 20% do tempo de resposta experimentado pelos usuários finais é gasto trazendo o documento HTML do servidor para o browser. Se você quer redurzir dramaticamente os tempos de resposta de suas páginas, tem de se concentrar nos restantes 80% a 90% da experiência do usuário final. No que sesses 80% a 90% são empregados?”

Umas das regras para se otimizar o carregamento de uma interface web, talvez uma das mais importantes, é diminuindo o número de requisições HTTP que esta interface está fazendo.

Existem diversas técnicas para se reduzir o número de requisições HTTP de uma aplicação web, porém, a que vamos abordar hoje é somente um pequeno pedaço deste trabalho, porém, uma parte muito importante dele.

A negligência e o cache.

Existe uma negligência muito grande por parte dos programadores e engenheiros com relação ao cache. Não podemos simplesmente cachear tudo e todos. Existe um nível de importancia que deve ser empregado para cada tipo de mídia que estamos cacheando. Vai de negócio para negócio, Na aplicação X os arquivos javascript podem não ser muito importante mas os arquivos mp3 são importantíssimos e vice-versa. É muito importante darmos o tempo certo de vida para cada tipo de mídia sempre olhando para o nosso negócio.

Botando a negligência de lado, por quê o cache é importante? para evitar que o usuário pague o preço. Para que ele baixe somente o que é necessário.

Diretivas .htaccess para cache

# 1 ANO
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>
# 1 SEMANA
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# 2 DIAS
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800, proxy-revalidate"
</FilesMatch>
# 1 MINUTO
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>

Veja que é possível darmos um tempo de “vida” do cache de um arquivo de acordo com a sua extensão. É importante ressaltar que os tempos que foram dados no exemplo acima é somente um exemplo. Como eu disse acima, é importante você colocar na balança o que é mais importante para o seu negócio.

.htaccess Time Cheatsheet

# TIME CHEAT SHEET
#      300   5 MIN
#      600  10 MIN
#      900  15 MIN
#     1800  30 MIN
#     2700  45 MIN
#
#     3600   1 HR
#     7200   2 HR
#    10800   3 HR
#    14400   4 HR
#    18000   5 HR
#    36000  10 HR
#    39600  11 HR
#    43200  12 HR
#    46800  13 HR
#    50400  14 HR
#    54000  15 HR
#    86400  24 HR
#
#    86400   1 DAY
#   172800   2 DAY
#   259200   3 DAY
#   345600   4 DAY
#   432000   5 DAY
#   518400   6 DAY
#   604800   7 DAY
#
#   604800   1 WEEK
#  1209600   2 WEEK
#  1814400   3 WEEK
#  2419200   4 WEEK
#
#  2419200   1 MONTH
#  4838400   2 MONTH
#  7257600   3 MONTH
#  9676800   4 MONTH
# 12096000   5 MONTH
# 14515200   6 MONTH
# 16934400   7 MONTH
# 19353600   8 MONTH
# 21772800   9 MONTH
# 24192000  10 MONTH
# 26611200  11 MONTH
# 29030400  12 MONTH

Se este snipet não funcionar (o que é bem improvável) você pode utilizar este snipet em conjunto com a extensão mod_expires do apache.

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A3600
ExpiresByType text/css A3600
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A300
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A300
</IfModule>

O legal de se utilizar o mod_expires é que ele trata o a questão do cache de acordo com o mime-type de cada arquivo e não somente pela extensão.

Tá, mais, é o ideal gerenciar desta forma?

Não. Existem formas mais inteligentes de gerenciar as mudanças dos seus arquivos e fazer com que eles sejam baixados novamente pelo navegador do usuário somente quando ele realmente for atualizado, porém, esta é uma forma um pouco mais “custosa” e eu certamente irei falar com mais profundidade sobre isso em um próximo post.

Conclusão

Podemos minimizar o número de requisições HTTP de nossa aplicação gerenciando de forma mais inteligente os arquivos que estamos incorporando dentro de nossa aplicação web utilizando recursos simples e nativos do nosso apache, como o exemplificado aqui. Esta não é a forma mais eficiente, mas com certeza, vai ajudar muito a minimizar o número de requisições HTTP que sua aplicação web fará nas nas próximas paginas que seu usuário for navegar.

Posts Relacionados:

  • Nenhum post relacionado!

Benchmarking de desempenho de código no PHP

Antes de mais nada, Benchmarking é o nome pomposo dado às práticas adotadas na indústria (não importa qual) que visam alcançar um desempenho/qualidade superior. Ou seja, Benchmarking é todo tipo de prática cujo objetivo é melhorar/maximizar/amplificar os resultados.

No artigo de hoje vamos abordar benchmarking focado em código, desempenho especificamente. Não é meu objetivo neste artigo aprofundar sobre profiling etc. Existem muitas práticas de benchmarking que podem ser utilizadas para poder alcançar algum tipo de amplificação na sua área, porém não daria para falarmos detalhadamente de todas em um único artigo.

Quando desenvolvemos aplicações para Internet e o stress da aplicação será muito grande (como um todo), temos que ter cuidado, muito cuidado. Conhecer mais de uma forma de se implementar uma única solução pode ser o que vai salvar o seu pescoço.

Benchmarking de código – na prática

Muitas vezes, quando estamos meditando para solucionar um problema, precisamos saber se aquela implementação é rápida. Mas, como assim, rápida? Como eu vou saber se uma determinada implementação de código/função é rápida o suficiente de forma que supra as necessidades sem comprometer a qualidade de modo geral do sistema?

Vale lembrar que o método que vou mostrar aqui faz com que os resultados variem de máquina para máquina, pois é tudo uma questão de processamento. Os resultados aqui apresentados são apenas para ILUSTRAR e SIMULAR para atingirmos resultados significantes.

Este é o seu momento “MythBusters”.

Descobrir qual é a forma mais rápida de se resolver um problema é uma tarefa simples (nem sempre), em determinados casos, não temos um parâmetro para saber se devemos seguir pelo caminho A ou B, tudo o que nos resta é saber várias formas de se codificar/implementar uma determinada solução e medir o desempenho de todas elas, cada trecho, para assim, resolver o problema.

Vou dar um exemplo de como se medir o desempenho de uma implementação de código, levando em conta um problema que tivemos aqui no trabalho.

Tivemos que desenvolver um framework adhoc (free style) onde nós conseguíssemos obter resultados semelhantes a alguns frameworks bem comuns na Internet como Code Igniter, Cake PHP etc. MVC, Inflector, ActiveRecord, Rotas de Urls etc.

Agora vem a pergunta na cabeça de vocês:
– Por que re-inventar a roda?

A empresa que pediu para que a gente re-inventasse a roda, alegou que estes são frameworks não “oficiais”, e são feitos/mantidos por pessoas em que eles não confiam (untrusted or non certified application).

Resumindo? Eles queriam ver como a “coisa” era implementada, para poder, assim, atingir o melhor desempenho e retirando tudo o que eles não precisam da aplicação, tornando-a mais leve.

A grande questão?

O aquivo ActiveRecord.class.php está demorando muito para terminar o seu serviço, quando você instanciava uma nova classe, a dita cuja tinha um modelo, que, por sua vez, também possuía um controle onde possuía todas as regras do negócio.

Sempre que executássemos uma método da classe por ex ->find, findFirst ou findAll ele retornava um array de objetos, ou seja, era um array e todas as suas posições eram compostas por objetos e suas respectivas propriedades (atributos).

Exemplo

Array
(
    [0] => Usuarios Object
        (
            [nome] => Igor Escobar 1
            [email] => blog@igorescobar.com
        )

    [1] => Usuarios Object
        (
            [nome] => Igor Escobar 2
            [email] => blog@igorescobar.com
        )

    [2] => Usuarios Object
        (
            [nome] => Igor Escobar 3
            [email] => blog@igorescobar.com
        )

)

Era mais ou menos assim que ele retornava os usuários de uma determinada tabela. Este é um array de objetos com apenas 3 elementos, mas para você ter um resultado para que possamos simular um resultado no benchmarking mais expressivo, você precisa de um array de objetos com mais elementos, pois iria exigir mais do processador, etc. No nosso experimento vou aumentar este array de objetos para 10.000 elementos e veremos quanto tempo ele demora para fazer o trabalho.

Medindo o desempenho (do trecho)

Criei uma class de exemplo, apenas para conseguirmos a estrutura vista acima:

<?php
public class Usuarios {
	var $nome;
	var $email;
}
?>

Agora, eu crio a implementação para atingir o resultado esperado:

$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;

Para medir o desempenho exatamente no trecho que queremos, eu utilizo a função microtime() do php.

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;
$time_end = microtime(true);
$Benchmarking1 = ($time_end - $time_start);
echo "Array de Objetos levou: " . $Benchmarking1 . " microsecondos<br />\n";
//Output: Array de Objetos levou: 0.04233980178833 microsecondos

Agora vamos criar uma outra implantação, ao invés de retornarmos uma array de objetos, vamos retornar um array de arrays, ou seja, seria uma array com n posições e todas as suas propriedades seriam INDICES do array e não mais atributos do objeto.

Exemplo

Array
(
    [0] => Array
        (
            [nome] => Igor Escobar 1
            [email] => blog@igorescobar.com
        )

    [1] => Array
        (
            [nome] => Igor Escobar 2
            [email] => blog@igorescobar.com
        )

    [2] => Array
        (
            [nome] => Igor Escobar 3
            [email] => blog@igorescobar.com
        )

)

O mesmo script, apenas montando de maneira diferente (array de arrays), ficou assim:

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$arraUsuarios[] = array (
			'nome' => "Igor Escobar {$i}",
			'email' => 'blog@igorescobar.com'
		);
endfor;
$time_end = microtime(true);
$Benchmarking2 = ($time_end - $time_start);
echo "Array de Arrays levou: " . ($Benchmarking2) . " microsecondos<br />\n";
//Output: Array de Arrays levou: 0.036391973495483 microsecondos

Qual método é mais rápido?

// Se resultado for negativo: Método 1 é mais rápido
// Se resultado for positivo: Método 2 é mais rápido
echo "Resultado: " . ($Benchmarking1 - $Benchmarking2);
//Output: Resultado: 0.007580041885376

Viram? Duas formas de fazer a mesma coisa e a segunda forma é 0.007580041885376 microsegundos mais rápida.

Conclusão

Neste simples teste, podemos tirar a seguinte conclusão: neste caso, utilizar a minha estrutura de retorno como um array de objetos é mais lento do que trabalhar com um array de arrays. Este é um teste fora da realidade, quanto mais próximo da realidade a complexidade do dia-a-dia, este número aumenta, tende a ser cada vez maior.

Veja que este exemplo não envolve conexão com banco de dados, acrescente todo o stress que envolve validação de regras de negócio, segurança, consistência e etc., e veja este número crescer MUITO mais.

Vale lembrar que eu não estou dizendo para vocês não, nunca mais, utilizarem objetos, porque não é isso, estou apenas ilustrando que NESTE CASO, foi mais rápido, e mais interessante para o projeto que o retorno desta função fosse um array de arrays, é tudo uma questão de escolher entre mysql_fetch_assoc, mysql_fetch_array, mysql_fetch_object ou mysql_fetch_row, cada uma tem suas características e são válidas dependendo da sua necessidade em questão.

Você pode aplicar isso em “tudo” na sua aplicação, até para saber quanto tempo uma determinada função demora para terminar seu trabalho basta utilizar o microtime() no começo e no final da função e subtrair os valores do maior para o menor.

$time_start = microtime(true);
//nome da função
$time_end = microtime(true);

E é isso, pessoal, espero que tenham gostado. Certamente, se vocês utilizarem este recurso para o seu crescimento profissional, será de muita valia para vocês.

Fonte Completo

<?php
class Usuarios {
	var $nome;
	var $email;
}

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$obUsuarios = new Usuarios();
	$obUsuarios->nome = "Igor Escobar {$i}";
	$obUsuarios->email = "blog@igorescobar.com";
	$arraUsuarios[] = $obUsuarios;
endfor;
$time_end = microtime(true);
$Benchmarking1 = ($time_end - $time_start);
echo "Array de Objetos levou: " . $Benchmarking1 . " microsecondos<br />\n";

$time_start = microtime(true);
$arraUsuarios = array();
for($i = 1 ; $i <= 10000; $i++):
	$arraUsuarios[] = array (
			'nome' => "Igor Escobar {$i}",
			'email' => 'blog@igorescobar.com'
		);
endfor;
$time_end = microtime(true);
$Benchmarking2 = ($time_end - $time_start);
echo "Array de Arrays levou: " . ($Benchmarking2) . " microsecondos<br />\n";

// Se resultado for negativo: Método 1 é mais rápido
// Se resultado for positivo: Método 2 é mais rápido
echo "Resultado: " . ($Benchmarking1 - $Benchmarking2);

?>

[]’s
Igor.

UPDADE: Este artigo foi reformulado devido a muitas dúvidas e questionamentos referentes a este meu método. Obrigado a todos que ajudaram no amadurecimento do conteúdo.

Posts Relacionados:

O que é Robot Friendly?

Robot Friendly é um termo usado no exterior para afirmar quando um site é amigo dos buscadores, ou amigo do robô (spider).

Por que tornar o meu site Robot Friendly?

A primeira pergunta que devemos nos fazer é: por que alguns sites ficam sempre no topo dos resultados das buscas, independente se ele é patrocinado ou não?

Os robots possuem uma série de regras, que são colocadas em prática quando eles acessam algum site, para determinar a relevância do mesmo, para uma determinada palavra-chave.

Alguns destes sites precisam trabalhar muito para conseguir um lugar na primeira página, pois de palavra em palavra a concorrência varia e da mesma forma que você trabalha para sempre tornar o seu site relevante, a concorrência também não para.

Alguns sites possui muitos links, muitos mesmo, e alguns deles são favoritados pelos buscadores, ou seja, além de ser seu concorrente, o site ainda é favorito dos buscadores naquela palavra chave. Tem coisas que só o tempo pode dizer se o seu destino será o fracasso ou a vitória.

De todos os usuários na internet, a grande maioria deles não passam da segunda, terceira página de resultados em um buscador. Saibam que primeira página do google, é um reflexo do que a sociedade precisa e procura.

Se eu vou no buscador e procuro por “Windows“, ele não vai apresentar nos primeiros resultados uma fábrica americana enorme de janelas concorda? por mais que faça sentido é verdade… da mesma forma que se eu ir no buscador e procurar por “banco” ele também não vai trazer uma pagina inteira cheia de lojas que vendem bancos e cadeiras.

O fato da grande maioria dos usuários não passarem da primeira página, é o que mais encorajam as pessoas para sempre estar otimizando os seus sites, para estarem sempre nas buscas. Uma página a mais que se ganha pode gerar um lucro e um aumento de tráfego considerável para a sua empresa.

Como faço para tornar meu site amigo?

Em novembro de 2006 praticamente todos os maiores sistemas de busca concordaram em utilizar o padrão do sitemaps. No site do projeto, possuí todas as regras que os buscadores concordaram em seguir, para indexar suas páginas.

Se você tem problemas na hora de gerar o sitemaps, por não conseguir instalar o programa no servidor, fornecido pela google (em python) ou por não ter estrutura de servidor para ativar a ferramenta, na internet possui alguns sites ou softwares que são capazes de gerar gratuitamente para você, basta informa a URL ou pode também ser feito através da internet.

Recomendo o uso do programa GSiteCrawler para gerar este arquivo. Uma boa maneira de começar a “relacionamento” positivo com os buscadores é fornecendo este arquivo sitemap.xml através do Google Webmaster Tools, nesta ferramenta você indica a url do local onde esta o sitemap no seu domínio para que o google indexe as suas páginas de maneira mais prática e mais rápida.

O legal é que no sitemap você consegue fornecer a prioridade de cada arquivo e a frequência que o arquivo é atualizado para que o google sempre forneça um conteúdo atualizado no seu buscador.

Recentemente uma notícia bem legal foi dada pelos buscadores Google, Yahoo e Ask, indicando uma nova forma de indicar o local do arquivo sitemaps que seria indicando o seu endereço dentro do arquivo robots.txt.

Uma coisa que poucos sabem, é que o robots.txt é uma outra maneira de dar um passo a mais no relacionamento positivo com o seu buscador. Além do robots.txt servir para apontar as regras que o robot deverá seguir para indexar suas páginas, serve também para indicar para o buscador que o seu site esta online a ativo.

Imagine um grupo de 40 mil sites, 10% deles tem chances de estar offline, para verificar se um site esta online ou offline o retorno pode demorar de 15 a 30 segundos, multiplique isso pelos 10% destes 40 mil e você obterá o tempo perdido pelo spider para estes que estão offline, agora imagina o quão “P. da vida” o spider deve ficar com o seu endereço. ;)

Sendo assim, crie um arquivo robots.txt mesmo que seja em branco, você ganha pontos.

Agora segue algumas dicas que podem tornar o relacionamento do seu site com o seus buscadores mais saudável e positivo:

  • Faça com que todas as páginas do seu site sejam acessíveis a partir da página principal, não mais do que 3 cliques.
  • Crie o sitemap para o seu site indicando quais páginas você gostaria que o buscador indexe.
  • Considere ter no máximo 250-300 palavras em cada página do seu site, se você cria páginas muito longas, os spiders podem ignora-la. Geralmente os buscadores não indexam mais do que 100kb de textp mas páginas.
  • Evite colocar conteúdo em imagens ou em animações flash de forma não acessível, os buscadores não conseguem adivinhar o que tem nas imagens.
  • Tenha certeza de que seu site não tenha links quebrados ou erros comuns expostos.
  • Se possível não use crie navegações via script, os buscadores não conseguem ler tais scripts.
  • Se o seu site possui páginas dinâmicas, evite passar muitos parâmetros via query string, os buscadores não são espertos o suficiente para entender todos os parâmetros
  • Você pode usar o arquivo robots.txt para informar o spider como ele deve se portar no seu site.
  • Tenha certeza de que o seu site esta online o tempo todo.
  • Faça com seu site seja indicado em grandes sites do seu ramo de atuação ou relacionados ao conteúdo do seu site, isso fará com que seu site seja indexado rápidamente e com um nível alto de page-rank.
  • Dê uma atenção especial para as suas metas tags. Apesar delas estarem começando a ser extintas pelo uso de valor dos buscadores, a maioria delas tendem a desaparecer com o tempo, mas recomendo que não as ignore.

Estas são algumas das dicas para melhorar o relacionamento do seu site com os spiders. Temos que levar em consideração também que os buscadores não são preciptados, um grande número de sites são colocados no ar todos os dias e um fator crucial para saber se o site vai ou não para o topo é o “tempo de vida” de um portal. A idade do domínio influência muito na relevância e na força das palavras chaves que estão expostas no site.

Leitura complementar:
Meta Tags: Será que o titulo esta muito grande? ;)

Espero ter contribuído!
[]’s

Posts Relacionados:

Problemas com UTF-8 with BOM?

Olá pessoal!
Como um dos objetivos deste blog é apresentar soluções para problemas cotidianos, hoje eu vou falar sobre um problema que enfrentei utilizando a codificação UTF-8 BOM em minhas páginas e sinceramente, até a pouco eu não sabia a diferença entre o UTF-8 sem o BOM e o UTF-8 com o BOM.

O Problema

Quando usamos paginas codificadas em UTF-8, em alguns user agents eu recebo algumas linhas extras ou caracteres não esperados no TOPO do documento ou no TOPO de arquivos incluídos… como eu removo estes caracteres?

Resposta

Se você trabalha com um arquivo codificado em UTF-8, provavelmente, seus problemas estão sendo causados pela presença da assinatura (BOM) do seu documento que o user agent não reconheçe.

A assintua (BOM) dos documentos UTF-8 estão sempre no topo do documento e normalmente você espera vêlos, mas não perca seu tempo. A única maneira (works for me) que fez com que pudesse ver a assinatura foi trocando a codificação do documento de UTF-8 BOM para um ISO, caso contrário, a única coisa que você verá, será uma linha em branco no começo do seu documento (e em alguns casos, como o meu, nem isso você vê).

A confusão

O grande problema causado pela assinatura dos documentos UTF-8 é que pêla experiência que cada programador possuí é de instinto o programador já sair à procura de linhas extras nos arquivos incluídos.
É neste pronto onde se é gasto um grande tempo… Depois de perter todo o seu tempo, então, você começa a ficar frustrado por não encontrar a linhas extras nos arquivos e começa a acreditar que tudo isso não passa de uma conspiração do dêmonio com a sua pessoa.

O que é a assinatura (BOM) dos documentos UTF-8?

Algumas aplicações inserem uma combinação particular de bytes no começo dos arquivos e isso é usado para indicar que o conteúdo a seguir, possuí caracteres Unicode. Essa combinação de caracteres é conhecida como assinatura ou Byte Order Mark. Alguns editores mostram a assinatura como uma linha extra outras aplicações como o Zend Studio mostram a assinatura como ( ).

A assinatura (BOM) do documento é importante?

No caso dos arquivos codificados em UTF-8 não, você pode retirar esta assinatura sem causar problemas de interpretação, a assinatura (BOM) do documento só é importante para documentos UTF-16 e UTF-32 ela é usada para informar como o user agent deve interpretar os caracteres.

Como detectar a presença da assinatura de arquivos UTF-8?

Primeiro, nós precisamos detectar se esta linha extra no começo do arquivo é realmente a assinatura BOM.
Você pode tentar procurar no olhometro, mas se o seu editor interpreta corretamente a assinatura do arquivo, lamento, mas você não verá. Se o seu editor não interpretar ou não reconhecer esta assinatura ele vai apresentar caracteres como  no início do seu documento. Se você utilizar um editor binário, capaz de mostrar valores em hexadecimal, a assinatura poderá ser indentificada pelo conjunto de bytes EF BB BF.

Alternativamente, se você possuir em mãos um bom editor, ele vai te dizer a codificação do documento na barra inferior do editor ou em algum menu que apresente o encoding do seu documento.

Se em nenhum destes casos você obter sucesso, existem algumas aplicações web que são capazes de detectar a assinatura (BOM) de documentos UTF-8.

Removendo a assinatura (BOM)

Se você possuí algum editor capaz de exibir esta assinatura, você pode remover na mão, apenas seleciona-la e apaga-la.

Alguns editores como o Notepad++ (Windows, free) e Komodo (Linux, Free) permitem que você especifique se você quer ou não a assinatura no ato em que você salva o arquivo, dê uma olhada no menu “Format”.

Outra opção, é você utilizar algum tipo de script que automatize a remoção da assinatura rápidamente e recursivamente em todos os seus arquivos. Existe um script feito em Perl, desenvolvido por Martin Dürst que faz isso para você:

# program to remove a leading UTF-8 BOM from a file
# works both STDIN -&gt; STDOUT and on the spot (with filename as argument)

if ($#ARGV &gt; 0) {
    print STDERR &quot;Too many arguments!\n&quot;;
    exit;
    }

my @file;   # file content
my $lineno = 0;

my $filename = @ARGV[0];
if ($filename) {
    open( BOMFILE, $filename ) || die &quot;Could not open source file for reading.&quot;;
    while (&lt;BOMFILE&gt;) {
        if ($lineno++ == 0) {
            if ( index( $_, '' ) == 0 ) {
                s/^\xEF\xBB\xBF//;
                print &quot;BOM found and removed.\n&quot;;
                }
            else { print &quot;No BOM found.\n&quot;; }
            }
        push @file, $_ ;
        }
    close (BOMFILE)  || die &quot;Can't close source file after reading.&quot;;

    open (NOBOMFILE, &quot;&gt;$filename&quot;) || die &quot;Could not open source file for writing.&quot;;
    foreach $line (@file) {
        print NOBOMFILE $line;
        }
    close (NOBOMFILE)  || die &quot;Can't close source file after writing.&quot;;
    }
else {  # STDIN -&gt; STDOUT
    while (&lt;&gt;) {
    if (!$lineno++) {
        s/^\xEF\xBB\xBF//;
        }
    push @file, $_ ;
    }

    foreach $line (@file) {
        print $line;
        }
    }

Cuidado com o BOM

Em alguns editores como o Widows Notepad, se você escolhe salvar o arquivo como UTF-8 ele automaticamente coloca a assinatura (BOM).

A assinatura (BOM) em arquivos CSS pode causar a falha de de interpretação de algumas regras em alguns user agents, por isso, deve ser removida.

Em alguns navegadores, a presença da assinatura pode fazer com que TODOS os caracteres da sua pagina sejam interpretados como se fossem UTF-8 independente de qualquer declaração contrária.

E é isso pessoal, espero que seja útil para vocês, espero que você não perca horas do seu dia tentando resolver este problema como eu e algumas pessoas da comunidade PHP passaram.

Em arquivos PHP, se você trabalhar como funções como header(); a assinatura causará aquele problema comum quando você enviar qualquer caracter para o browser antes dos header();

[]’s
Igor

Posts Relacionados:

  • Nenhum post relacionado!

12 dicas para otimizar seus códigos PHP

É sempre útil ler algumas dicas rápidas para melhorar a sua codificação, geralmente temos vícios que adquirimos no dia-a-dia que sem sabermos tornam o nosso código mais lento.

Segue abaixo 12 dicas para melhorar o processamento dos seus códigos PHP.

1. Se um método pode ser static, declare-o como static! O desempenho aumenta 4 vezes

2. Evite utilizar metódos mágicos como __get, __set e __autoload, se possível

3. require_once() é dispensável e demanda bastante memória

4. Use caminhos completos (full path) nos includes e requires, pois é gasto menos tempo resolvendo os caminhos do sistema operacional

5. Se você quer descobrir o tempo em que o script começou a ser executado, é preferível utilizar $_SERVER[‘REQUEST_TIME’] do que time()

6. Veja se pode utilizar strncasecmp, strpbrk e stripos ao invés de regex

7. str_replace é mais rápido que preg_replace, mas strtr é 4 vezes mais rápido que str_replace

8. Se uma função, como de substituição de strings, aceitar tanto arrays como caracteres simples como argumentos, e se a sua lista de argumentos não é muito longa, considere fazer algumas declarações redundantes de substituição, passando um caractere por vez, ao invés de uma linha de código que aceita arrays como argumentos de busca e substituição

9. Supressão de erro com @ é muito lento

10. $row[‘id’] é 7 vezes mais rápido que $row[id]

11. Mensagens de erro demandam mais processamento

12. Não utilize funções dentro de loops, como por exemplo: for ($x=0; $x < count($array); $x). A função count() é chamada todas as vezes que o loop é executado.

Fonte: http://www.moskalyuk.com/blog/php-optimization-tips/1272

Posts Relacionados:

Web Standards vs. Projeto em dia

Principalmente nas micro-empresas este é um dilema muito comum e recorrente na cabeça dos pobres desenvolvedores.

Muitas vezes o fator web standards nem é um pré requisito no projeto, acontece que a grande maioria dos programadores que entendem a essência dos Web Standards, gostam e sabem, o motivo da utilização dos padrões no projeto.

O grande problema surge, quando o cliente pede algo “lunar” e nós, desenvolvedores temos que entrar no mundo highlander do cliente e desenvolver soluções a altura.

Acontece que, geralmente, soluções mirabolantes requerem implementações mirabolantes, consecutivamente, o nível de manipulação do documento XHTML por meio de Javascript é alto e muitas informações são expostas na marcação HTML, para que o JavaScript possa se guiar.

Tenho certeza que de todos os meus leitores, pelo menos um! vai se identificar com um caso parecido.

O grande pensamento vem a cabeça:

– O sistema não esta validando, e agora? eu só consigo implementar esta solução desta forma, não consegui pensar em outra forma de implementar, e fazer com que meu código consiga se guiar de maneira eficiente, para manipular este documento.

– Perco mais 1, ou 3 dias pensando em uma nova solução somente para implementar esta solução sob o plano B ou deixo este erro de validação passar e sigo em frente com o cronograma?

Caros amigos, não se desesperem. Já se foi o tempo onde os programadores eram neuróticos por validação.

Isso já cansou de ser dito: – Validar o seu código pela W3C nada mais é do que verificar se o seu código esta “gramaticalmente” escrita de maneira correta, ele estar validado não garante que o seu código será renderizado da mesma forma em outros navegadores.

E entramos no dilêma da guerra dos browsers. Você segue os padrões, mas o browser do seu cliente não, e ai? o que acontece depois ? …

Se você se preocupa com os padrões, ótimo!, Deve!

Colocar em risco o ciclo de vida do projeto por causa de um erro de validação não compensa para você nem para sua empresa, pode ter certeza que se você tiver somente este erro, o seu site/sistema não vai se comprometer ou deixar a desejar para o seu cliente.

Pense muito bem na hora de fazer esta decisão. Se você tem um código 100% validado, ótimo! se você tem próximo a 95% validado, ótimo também!

A grande sacada deste texto é mostrar pra vocês que foi se o tempo onde as pessoas eram loucas e fissuradas pelo validador da W3C. O validador deve ser somente ser usado como parâmetro para verificar a sintaxe do seu código XHTML, muitas coisas podem passar despercebido na correria do desenvolvimento, da mesma forma que muitas coisas podem ser corrigidas sem comprometer o andamento do projeto com a “ajuda” do validador.

Use o validador como uma ferramenta aliada e não como uma ferramenta inimiga.

O W3C é uma organização que documenta “recomendações” e não “obrigações”, existe as recomendações que são extremamente fundamentais para a renderização e comportamento correto em diferentes plataformas, porém, temos que ter um meio termo para tudo.

Links

Espero ter contribuído!
[]’s

Posts Relacionados:

SEO White Hat vs. Black Hat

Hoje em dia é comum vir um cliente até você e perguntar:
– Vocês conseguem fazer meu site ficar em primeiro nas buscas?

Nessas horas muitos profissionais pensam em trocar o chapéu para poder deixar o cliente surpreso ou feliz.

De todas as práticas que um SEO pode adotar para garantir um bom posicionamento ou não de um projeto nas buscas, elas são divididas em duas categorias, técnicas black hat e técnicas white hat.

Técnicas Black Hat SEO (Técnicas de chapéu preto)

Existe um amplo significado do termo Black Hat, profissionais do ramo de informática chamam Black Hat, as práticas adotadas por profissionais para atingir um certo objetivo sem a autorização prévia do orgão, empresa e/ou pessoa responsável.

Este objetivo pode ser vários, mas especificamente neste texto irei abordar o termo Black Hat no mundo das buscas.

Falando de SEO especificamente, black hat são técnicas utilizadas para garantir um bom posicionamento nos buscadores em curto prazo.

Quem nunca se deparou com um site de fundo branco e ao apertar o CTRL + A, aparecer uns textos que normalmente não se pode ver, hoje é possível de encontrar prática como essa executadas em grandes projetos (que não posso citar) para tentar passar duas ou três paginas de vantagem dos concorrentes com o objetivo de tornar a pagina mais relevante na visão dos buscadores usando artifícios.

Nas Diretivas para Webmasters do Google é recomendado que você:

Como podem ver o próprio google já tem em seu banco de dados, as principais práticas que trazem resultados eminentes, lembre-se, a Google é uma empresa de milhões de dolares, não abuse nem duvíde da inteligência do seu negócio, eles estão de olho.

Sou Black Hat SEO, o que pode acontecer comigo?

O google afirma que é capaz de reconhecer tais práticas e afirma também que existe penalidades para pessoas que tentam ganhar posicionamento nos buscadores utilizando artifícios:

  • Ignorar o algoritmo sem penalizar o site.
  • Fazer com que caia o posicionamento do site nas buscas, tornando-o ridiculamente irrelevante.
  • Apagar o site do índice do Google.

Técnicas White Hat SEO (Técnicas de chapéu branco)

As técnicas white hat são as técnicas “legais” recomendadas, que podem ser executadas por um SEO para atingir bons resultados nos buscadores em alguns casos, em curto prazo e em alguns, a longo prazo.

De modo geral, para ser um White Hat SEO basta criar o seu projeto com amor, com trabalho e com seriedade.

Todo site que produz conteúdo para o seu usuário final, não tem por quê ser encarado de forma ruim pelos robots.

Fechando o assunto…

Se você possui um negócio, certamente não vai querer que o SEO do seu projeto use tais práticas, elas trazem bons resultados a curto prazo, porém, os sites que foram otimizados por um Black Hat SEO tendem cair nas buscas drasticamente no futuro, o que é bem ruim para os negócios.

Se você quer ser sempre bem posicionado, faça o seu trabalho com calma e com carinho para os usuarios, boas notícias se espalham e as paredes tem ouvidos (google).

Vale lembrar que existe várias coisas que favorecem o seu conteúdo a um bom posicionamento:

  • Código fonte semântico.
  • Quanto mais limpo for o seu código fonte, melhor os robots conseguiram classificar a relevancia e o teor do seu conteúdo.
  • Crie conteúdo para o seu usuário final e não para o buscador.
  • O Tempo de vida do dominio é um favor importante.
  • Troque links, faça parcerias com sites do mesmo gênero, isso fortalece o seu site (aumento de pagerank).
  • Evite o uso excessivo de animações flash, os robots tem dificuldade de ler tais formatos de mídia consecutivamente identificar o gráu de relevancia do seu material.

Links Interessantes:
http://www.seomarketing.com.br/black-hat-SEO.html
http://www.marketingdebusca.com.br/black-hat-seo/

Webtutoriais:AD9497F1

Posts Relacionados:

A importância das tags

Quando queremos estudar sobre qualquer assunto, é muito importante pesquisar não só o assunto em si, mais também, grande parte dos assuntos que o cercam, este é um grande diferencial que se levado a sério pode se tornar uma grande característica.

Por quê devo estudar a semântica das tags?

Quando falamos de semântica não falamos de uma só coisa, existem várias técnicas de codificação e formatação de hiper-textos que só podem ser concluída com êxito se levado o conhecimento semântico das suas tags e propriedades a sério como o tableless por ex.

Imagine como seria a criação de um layout tableless, se existissem somente 15-20 tags HTML, sim! aquelas principais que é mais comum de se encontrar nos layouts.

Imagine quantos ids e classes diferentes teríamos que criar, para definir todo o padrão visual de um site, se todas as tags se resumissem em 10 ou 20 tags de marcação que muitos estão acostumados a utilizar.

Então…qual a importância de conhecer o valor semântico das tags? ou melhor, não só das tags que você conhece , mas procurar conhecer novas tags sua história de uso e aplicação.

Quem trabalha com a criação de sites à muito tempo, pode ver na prática a diferença quando se conhece um numero limitado de tags e um numero mais abrangente, são dois lados da moeda, levando em conta que o estudo semântico das tags, não era levado muito a sério pelos desenvolvedores na época em que tudo se resumia em tabelas.

A codificação do seu documento html/xhtml fica muito mais rápida e menos “melosa”, quem não acha um saco ter que ficar toda hora lembrando o nome “daquela” classe ou “aquele” id definido no css para que uma tag assuma uma característica visual?

Quando conhecemos um numero maior de tags, podemos deixar o nosso código muito mais ramificado/desmembrado e independente de outros recursos, sem falar na hora da manipulação do documento utilizando DOM, tudo fica muito mais fácil e prático, por que eu só preciso simplesmente, criar o conteúdo, formata-lo, livre de classes e ids e com um código CSS bem escrito, toda a sua formatação e forma é automaticamente assumida.

Para tudo existe uma razão!

Enfie insto na cabeça, para tudo existe uma razão, todas as tag que conhecemos, foram criadas por um motivo, para atender uma demanda, por isso devemos estuda-las para utilizarmos somente para o que ela for pré-destinada.

Aonde posso aprender mais sobre semântica?

Separei alguns links interessantes para você que se interessa sobre o assunto e ainda tem “aquela” preguiça de pesquisar mais sobre o assunto, é muito complicado colocar no papel todos os benefícios de se aderir esta “característica” que comentei no começo do texto, somente utilizando na prática para poder saber o quão transformador pode ser este habito.

Web Semântica é uma extensão da Web tradicional
http://www.bax.com.br/news/News_Item.2004-04-29.8261853316

As premissas da Web Semântica
http://outrolado.com.br/Artigos/as_premissas_da_web_semantica__

A Semântica é que manda
http://www.tableless.com.br/a-semantica-e-que-manda

Introdução à semântica web
http://revolucao.etc.br/archives/introducao-a-semantica-web/

Web Semântica
http://www.encontros-bibli.ufsc.br/Edicao_18/2_Web_Semantica.pdf

Semântica Web
http://revolucao.etc.br/archives/category/semantica-web/

A web Semântica
http://www.tableless.com.br/a-web-semantica

Podcast – Microformatos e Semântica
http://brunotorres.net/blogbits-podcast-8-microformatos-e-semantica

Site recomendado – Semântico
http://www.semantico.com.br/

Introdução à web semâtica
http://www.acordapraweb.com/acorda-uma-introducao-a-web-semantica/

Espero ter contribuído!
[]’s

Posts Relacionados:

Aumente as chances do seu projeto/site dar certo

O trabalho de concepção e amadurecimento de uma idéia é uma tarefa complicada. Todos os dias converso com profissionais do ramo de Internet e falamos sobre muitas idéias. Todas envolvem dinheiro, seja de forma direta ou indireta.

O que é muito comum ser dito nesses grupos é sobre como ganhar dinheiro através de programas de afiliados como Google AdSense, Hotwords, Text Link Adst, UOL Links Patrocinados etc.

Hoje eu não vou falar sobre como otimizar seus ganhos nestes programas, pois acredito que na própria internet, possuem muitos e muitos artigos falando sobre isso, não vale a pena ficar “duplicando” o que é dito por ai tão incansavelmente.

Cuidado com o dinheiro

Quando vamos elaborar uma idéia é muito comum pensarmos em dinheiro, é comum, e algo muito maligno para o futuro e sobrevivência do seu projeto. Devemos pensar, claro, porém, pensar só nisso, vai acabar te cegando para outros pontos importantes que vão além do que só encher o bolso de dinheiro.

Deixe o fator “ganhar dinheiro” para último plano, amadureça a sua idéia todos os dias, anote tudo, não deixe nada escapar, e em último plano, pense em como trazer um retorno para você utilizando tudo o que você planejou de forma sadia, ou seja, de forma que o seu sistema, o seu planejamento, irá te sustentar a longo prazo, sustentabilidade.

Dando forma a idéia

Devo ressaltar, que não é meu objetivo ensina-lo como “documentar” a sua idéia, meu objetivo é te ajudar COMO você deve pensar para que o seu projeto dê certo ou ao menos aumente as chances dele dar certo.

Certifique-se de que você, com sua experiência, consiga garantir longevidade ao seu projeto, o sucesso de um projeto, esta diretamente ligado a sua continuidade e não apenas o seu começo, ser hype esta completamente fora de questão. Não adianta começar algo e não saber como dar continuidade ao que começou.

Não seja hype, seja original.

Ser hype tem seus próis e contras, quem acompanha a blogosfera já viu o que tem de blogs por ai que vivem de hypes para poder ganhar dinheiro a curto prazo. Para quem não sabe o que é hype, vou te dar um exemplo:  Cicarelli, já sabe até do que eu estou falando né? Agora tente imaginar a quantidade de dinheiro que os blogueiros e sites que vivem de hypes ganharam com este acontecimento? Postando os videos, fotos e fakes em seus sites? Então, isso é uma hype, porém, o objetivo é manter uma renda, tirarmos da abstração uma idéia e torna-la sustentável.

A volta é o mais importante.

Esta talvez seja a parte mais importante no processo de amadurecimento de uma idéia, é muito comum, ver uma pessoa entusiasmada falando de um projeto, que você sabe que é legal, porém,  o idealizador do projeto simplesmente se céga e só consegue pensar em como o projeto vai ser legal por que tem isso e aquilo e zilhões de coisas, coisas que na prática não fazem diferença.

Se concentrar no que é obvio não é a saída, centre-se em criar funcionalidades ao seu projeto que atribuíram valor ao seu projeto, esta são as melhores características de um projeto de sucesso, o mais importante não é atrair visitas, o mais importante é criar recursos e funcionalidades que farão com que o usuário volte. Esta é a grande sacada, visitas é consequência, a volta do visitante garante a sua sustentabilidade e o sucesso perpétuo (até que alguém lance algo que o substitua) do seu projeto.

Acredito que se a sua linha de raciocínio caminhar por este lado, isso só irá aumentar MUITO as chances do seu projeto dar certo. Espero ter contribuído com seu projeto, e quem sabe, sua vida, sua profissão.

[]’s
Igor.

Posts Relacionados: