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
Ó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….
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
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.
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.
Você poderia postar o “php_bcompiler.dll”?
segue:
http://dllcentral.com/php_bcompiler.dll/5.2.5.5/
Eu ja havia tentado com essa, porém é incompativel com o WAMP.. (http://img530.imageshack.us/img530/8656/semttuloyx.jpg)
Mas obrigado pelo interesse 😉
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
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
Olá Flávio, estranho hein … não deu mensagem de erro ?
Beleza, replica lá, abraços!
Muito bom cara parabéns pelo post!
Didática fácil, simples e bem explicado.
Pingback: Criando Extensões para o PHP: Parte I - Introdução | Tas Blog: Tiago Silva
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
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();
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
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
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
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?
Na época usava a 5.2, funcionava legal. Depois disso não fiz mais testes.
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
Israel, você precisa ter habilitado o bcompiler.
http://php.net/manual/en/book.bcompiler.php