Fiz um código super simples, para deixar qualquer HTML em uma única linha, sem tabs, espaços, .

Sobre o CSS Eu já escrevi o post Eu vs cache. Ganhei a batalha. Vou usar o projeto do Trabalhando com URL amigável no PHP para edita-lo e compactar o HTML dele.

Um dos segredos deste projeto é que todas as requisições passam pelo index.php graças ao direcionamento do .htaccess.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

 Então, neste index.php devo adicionar o chamado da função ob_start() antes de qualquer saída HTML. No meu caso vou adiciona-lo na linha 2, após o <?php .

<?php
ob_start();
require "classes/Url.class.php";
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
<head>
.....

O que o ob_start() faz?

Esta função irá ativar o buffer de saída. Enquanto o buffer de saída estiver ativo, não é enviada a saída do script (outros que não sejam cabeçalhos), ao invés a saída é guardada em um buffer interno.

O conteúdo deste buffer interno pode ser copiado em uma variável usando ob_get_contents(). Para enviar o que esta no buffer interno, use ob_end_flush(). Alternativamente, ob_end_clean() irá silenciosamente descartar o conteúdo do buffer.

Fonte: http://br.php.net/manual/pt_BR/function.ob-start.php

Então esta função manda guardar tudo que é HTML que deveria ser enviado para o browser para poder ser tratado depois. Então agora com este HTML guardado podemos analisar, editar e fazer o que for preciso. Então na última linha do nosso index vou adicionar as seguintes linhas:

$html = ob_get_clean ();
echo preg_replace('/\s+/', ' ', $html);

A função ob_get_clean obtém o conteúdo do buffer e exclui o buffer de saída atual e neste buffer esta todo o HTML que foi gerado pelo site/sistema/blog.

A segunda linha faz um replace de tudo que for espaço, quebra de linha (\n e \r) e tabulação (\t)por um espaço. Então as centenas de espaços que existe para indentar seu código serão removidos por um único espaço.

E, por fim nosso index.php fica assim:

<?php
ob_start();
require "classes/Url.php";
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Trabalhando com URL amigável no PHP</title>
    <meta name="author" content="Layout: Mauricio Samy Silva / Código: Eduardo Kraus" />
    <link rel="stylesheet" type="text/css" href="<?php echo URL::getBase() ?>css/style.css"/>
</head>
<body>
<div id="tudo">
    <div id="topo">TOPO</div>
    <div id="principal">
        <?php
        $modulo = Url::getURL( 0 );

        if( $modulo == null )
            $modulo = "modulo1";

        if( file_exists( "modulos/" . $modulo . ".php" ) )
            require "modulos/" . $modulo . ".php";
        else
            require "modulos/404.php";
        ?>
    </div>
    <div id="navegacao">
        <p><a href="<?php echo URL::getBase(); ?>modulo1">Módulo 1</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo2">Módulo 2</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo3">Módulo 3</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo4">Módulo 4</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo5">Módulo 5</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo6">Módulo 6</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo7">Módulo 7</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo8/parametro/sei-la/alguma_coisa/25/quase-nada">
            Módulo 8 com sub-módulo</a></p>
        <p><a href="<?php echo URL::getBase(); ?>qualquer">Módulo 404</a></p>
        <p><a href="<?php echo URL::getBase(); ?>teste.php">Teste.php</a></p>
    </div>
    <div id="rodape">RODAPE</div>
</div>
</body>
</html>
<?php
$html = ob_get_clean ();
echo preg_replace('/\s+/', ' ', $html);

Veja o exemplo rodando completo em http://php.eduardokraus.com/code/10045/ e não se esqueça de olhar o código fonte dele view-source:http://php.eduardokraus.com/code/10045/.

Quer o código fonte completo deste exemplo? Clique aqui.

Se você usa Wordpress, edite o arquivo index.php da raiz do Wordpress e faça assim:

<?php
ob_start();
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');

$html = ob_get_clean ();
echo preg_replace('/\s+/', ' ', $html);

Veja rodando: view-source:http://www.marcelaroesner.com.br/category/blog

18 comentários

Deixe uma resposta

  1. Funcionou perfeitamente no meu site Parabéns!

     
  2. Cara, funcionou perfeitamente.
    Mudou algumas variáveis, mas deu para ajustar.
    É isso aí.

    Muito foda mesmo
    Valew;;;

     
  3. Eu testei esse código que você recomendou para wordpress mas deu errado. Apareceu uma mensagem mandando configurar o visor para Mobile.
    O que pode ter acontecido?

     
  4. Aonde apareceu a mensagem para "configurar o visor para Mobile"?

     
  5. Olá, tudo bem!
    Eu gostei do artigo.
    Muito bom mesmo, meus parabéns!

    Outra maneira simples é compactar todo o conteúdo do site usando o Gzip...

     
  6. Ola DiCarlos

    O Gzip comprime e não compacta. Gzip deve ser executado depois da compactação.

    Compactar é remover todos os caracteres que não fazem diferença para o HTML, como por exemplo espaços duplos, tabs duplas, etc..

     
  7. Boa tarde Eduardo,

    Você teria uma dica dessa para quem usa Wordpress (um plugin), pois fazer essas alterações no Wordpress fica um pouco complicado

    Aguardo.

    Obrigado pelo conteúdo, um abraço e sucesso.

    AutoSurf Brasil.

     
  8. Então... mas por fazer isso em tempo de execução, acredito que pesa muito ao servidor e também ao usuário que vai precisar esperar encher o buffer para depois ver o conteúdo da página.

    Não seria mais interessante criar uma biblioteca (classes) para dar esse trabalho de compactação ao desenvolvedor e não ao servidor?

    Por exemplo: Vamos supor... tenho a página index.php e contato.php... antes de fazer upload ao servidor, passaria essas páginas na biblioteca e compactaria, obteria o arquivo .php compactado e depois enviava ao servidor já compactado, dessa forma não fica a cargo do servidor fazer a compactação inúmeras vezes a cada acesso à página.

    O que acha? Se achar interessante, podemos desenvolver juntos a lib via github.

    Abraços.

     
  9. O grande problema disso é que o código PHP no servidor ficará em apenas uma única linha.

    E, não é tão pesado assim, visto que o pagespeed nem reclama: goo.gl/JKR94F e é um mau necessário...

     
  10. Olá Eduardo, primeira vez que acesso seu blog e gostei do assunto deste post.

    Achei interessante o método usado para compactar... ainda não testei... mas tenho uma questão que acho válida analisar:

    Pelo que vi dando uma olhada rápida no método usado, ele é executado em tempo de execução via .htaccess, certo? Isso significa que a cada acesso ao site irá disparar a compactação na página sendo visitada?

     
  11. Sim, é executado em tempo de execução de cada página, e não é via .htaccess e sim, cada vês que acessar alguma página será compactado o HTML.

     
  12. já tentei de todas as maneira mais não conseguir compactar o html da minha pagina.

     
  13. Show de bola, parabéns

     
  14. tive problemas em diversos sites com o caracter "à" usando essa sintaxe no preg_replace

     
  15. OLa, no meu site não funcionou >> http://noticiasmobile.com.br poderia me ajudar eu uso o wordpress.

     
  16. Show de bola, melhorou bastante