Compilando Classes PHP

Compilando Classes PHP

Olá,

Vamos  falar sobre compilar códigos/scripts PHP, a idéia seria compilar aplicações proprietárias para impedir que seu código seja alterado e redistribuído sem sua permissão.
No entanto, não quero entrar na discussão que cerca a web, “ah mas não é 100% seguro”, “mas não tem mesmo como o cara decompilar?” …
Já adianto que isso não é um debate sobre a capacidade humana (caramba, praticamente chico xavier), eu mesmo acredito que nada é 100% seguro,  aposto que muitos estão utilizando software pirata que o cara criou e sonhou que nunca seria “quebrado”, a idéia é simples para quem desejar utilizar, e blá blá blá à parte… vamos ver essa idéia!

Precisaremos primeiramente do bcompiler, módulo nativo do PHP, que por padrão está desabilitada no seu php.ini;
Para habilita-la, abra seu arquivo php.ini e descomente a linha:
extension=php_bcompiler.dll  (windows )
extension=php_bcompiler.so   ( *nix )

e também:
extension=php_bz2.dll

Precisaremos também de uma classe (claro), compilar um script qualquer é sacanagem demais, nem queira ter isso como algo proprietário (tô aloprando eu tenho essas coisas aos montes).

Criaremos uma classe bem simples, a idéia é transformar em bytecode, então não vamos desviar o assunto ok.

Classe Usuario  (Usuario.class.php)

<?
 Class Usuario
 {
 public $name;
 public $mail;

 public function __construct($name,$mail)
 {
 $this->name = $name;
 $this->mail = $mail;
 }

 public function getName()
 {
 return $this->name;
 }

 public function getMail()
 {
 return $this->mail;
 }
 }
?>

Bem, uma classe, dois atributos e três métodos, sendo um deles o construtor que recebe nome e email como argumentos.
Tá legal, agora vamos criar um arquivo PHP que irá compilar essa classe.

O Compilador Bytecode  (compiler.php)

<?
// cria um arquivo novo chamado Usuario.class
$fh = fopen("usuario.class","w");
// direciona o compilador para o arquivo ainda vazio
bcompiler_write_header($fh);
// grava o conteudo da nossa classe no novo arquivo
bcompiler_write_file($fh, "./Usuario.class.php");
bcompiler_write_footer($fh);
// fecha o arquivo compilado
fclose($fh);
?>

Esse arquivo tem como única função, compilar a classe Usuario.class.php, para compilar diversos arquivos é preciso usar um pouco de imaginação para criar um script que leia o diretório e compile todos os arquivos, não falarei sobre isso, já existe um post sobre “Ler arquivos de um diretório“.

Ao fim da execução desse arquivo e supondo que ele esteja no mesmo diretório da classe,  o arquivo Usuario.class ( fopen(“usuario.class”,”w”) ) criado no início do arquivo compiler.php terá o conteúdo em bytecode de nossa classe (Usuario.class.php);

Agora é a hora em que você tenta abrir o arquivo em seu editor de texto preferido (ah, no win o meu é o notepad++ )  para ver  o conteúdo do arquivo compilado, fique à vontade mas volte para continuarmos e você ver como usa-lo!

Por último, vejamos como instânciar um objeto da classe compilada (Usuario.class).

Criando Obj com a classe compilada (usuario.php)

<?
// carrega a classe compilada
bcompiler_load('usuario.class');
// instancia do obj, passando os argumentos do construtor
$foo = new Usuario('Jarvis','[email protected]');
// chamada ao metodo getNome
print $foo->getNome();
// chamada ao metodo getMail
print $foo->getMail();
?>

E é isso aí, a chamada ao bcompiler_load nos carrega a classe e à partir disso é a utilização normal, claro que, se você precisar alterar a classe terá que compilar novamente (compiler.php)!
Se avaliar bem, é bem simples, só lhe acrescentará um linha a mais no código para carregar a classe e terá seu código protegido (se é isso que deseja).
Acho que nem preciso falar sobre a organização de tudo isso, né? Claro que é de extrema importância que organize os arquivos, classes originais em um dir (ambiente de desenvolvimento), os arquivos compilados em outro, etc …
Após ter compilado todos os arquivos você já pode remover do pacote de sua aplicação os arquivos originais (.class.php) e guardar em outro local, se você não fizer isso, compila-los não fará sentido, não é?

Para fixar a idéia, você cria uma classe, compila, move a original para outro local fora do pacote de sua aplicação (já que não irá envia-las com os fontes) e irá utilizar o bcomplier_loader para trabalhar com as classes compiladas.

E para finalizar, esclarecerei a sua dúvida mais intrigante nesse momento:

<?
# eu utilizo sim o # para comentar linhas únicas, mas no wordpress
# o highlight não deixa comentário verdinho com # (mu-ah-ha)
?>

Até a próxima,

Rafael Clares

Este post tem 21 comentários

  1. Leandro Correa dos Santos

    Ótimo artigo. Estou pensando em desenvolver um programa ( tipo um IDE ) pra realizar
    a compilação das classes.

    Sobre os comentários com # ou // , pra mim é uma questão indiferente…rs….

    1. Rafael Clares

      Leandro, legal cara, uma IDE para isso seria perfeito… Talvez em GTK não seja tão difícil.
      O lance dos comentários foi pra descontrair hehehe
      Mas não esqueça de mim quanto a IDE hein… quero ver depois!
      abraços

  2. Felipe Melo

    Legal o tópico e a iniciativa com o bcompiler mas dá uma olhada na versão mais nova do PHP, parece que habilitar o bcompiler não é mais tão simples. Se você conseguir simplificar gostaria de ver novo tópico explicando como se faz, agradeço.

    1. Rafael Clares

      Felipe, eu utilizo a versão 5.3.3 e não tenho nenhuma dificuldade, também não vi nada a respeito, seria legal se tivesse colocado a fonte ou reportado a dificuldade que você menciona. Obrigado pelo comentário.

      1. Raphael

        Você poderia postar o “php_bcompiler.dll”?

        1. Rafael Clares

          Brother, eu utilizo o EasyPHP e nunca precisei baixar nenhuma DLL, por isso nem sei como te ajudar, a principio vi que a versão da DLL do link que te passei é diferente da versão do seu PHP, já é um bom começo tentar baixar da mesma versão.
          Abs

  3. Flávio

    Cara testei no WAMP e o php_bcompiler.dll não funfa, mas achei interessante vou replicar no meu blog seu post citando a fonte

    1. Rafael Clares

      Olá Flávio, estranho hein … não deu mensagem de erro ?
      Beleza, replica lá, abraços!

  4. Mauro

    Muito bom cara parabéns pelo post!
    Didática fácil, simples e bem explicado.

  5. Renato Cassino

    poo to tentando compilar o php a dias e não consigo. Aparentemente o meu php não reconhece a dll php_bcompiler.

    Tentei no xampp e no easyphp e nenhum deles vai
    como nem o meu xampp nem o easy php tinham eu baixei a dll php_bcompiler.dll e coloquei na pasta ext dos dois.
    Adicionei no php.ini
    reiniciei e não funciona. oO

    o erro que dá é o seguinte

    No EasyPhp
    Fatal error: Call to undefined function bcompiler_write_header() in C:Program Files (x86)EasyPHP-12.1wwwcompilador.php on line 5

    No Xampp
    Fatal error: Call to undefined function bcompiler_write_header() in C:xampphtdocswtcompilador.php on line 5

    a mesma coisa nos dois

    Alguém sabe me ajudar??

    Desde já agradeço

    1. Rafael Clares

      Fala Renato, cara no easyPHP tem um probleminha que é o seguinte:
      – Quando você habilita um lib/módulo pelo gerenciador dele mesmo, as vezes mesmo marcado não habilita, nesse caso, no easyphp
      tem a opção de abrir o arquivo php.ini no bloco de notas. Faça isso e confirme se a linha está mesmo descomentada;
      Depois disso, verifique se o módulo foi carregado através do echo phpinfo();

      1. Renato Cassino

        pois é. Na verdade eu nem sabia que existia metodo mais “interativo” para enviar dlls. haha
        eu fiz pelo bloco de notas mesmo no php.ini pelos dois, tanto pelo xampp quanto pelo easy php

        não descomentei linha nenhuma, pois a dll não se encontrava, eu adicionei a linha
        extension=php_bcompiler.dll

        como não existia essa dll na pasta, baixei no google e joguei lá.
        porém esse erro acontece, já reiniciei o servidor local varias vezes e acontece o mesmo erro.
        Já até reiniciei o computador para ver se resolvia e o erro persiste.

        To suspeitando que essa dll que eu baixei possa estar bixada.

        Seria possível me enviar a dll certa por email, já que no meu xampp e no meu easyphp não vieram.

        [email protected]

        só uma pergunta, eu utilizo windows 7 x64 bits, isso não interfere em nada neh?? oO

        desde já agradeço

        1. Rafael Clares

          Renato, eu uso win7 64bits e não tenho nenhum problema. Uso o easyphp versão EasyPHP-2.0b1 procure no google por EasyPHP-2.0b1-setup.exe

  6. Renato Cassino

    Finalmente funcionou!! xDD Estava utilizando o xampp e lá de fato não funcionou nem copiando a dll e jogando lá.
    Passei meus sistemas para o easyPhp pq lá está funcionando.

    =D
    Muito obrigado mesmo! xD

  7. Júnior Gonçalves

    Rafael, esta biblioteca não vingou? Utilizo o PHP 5.4, fiz o download de algumas versões do php_bcompiler.dll mais não funcionou. Achei o post e a ideia muito interessante, sei que o post é antigo mais você tem alguma noticia a respeito?

    1. Rafael Clares

      Na época usava a 5.2, funcionava legal. Depois disso não fiz mais testes.

  8. israel Nogueira

    olha o aviso que deu…

    Fatal error: Call to undefined function bcompiler_read() in E:\localhost\www\ssl.com\license\index.php on line 66

Deixe um comentário