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

Comments

  1. Responder

    • Responder

  2. Responder

  3. By Flávio

    Responder

    • Responder

  4. By Mauro

    Responder

  5. Responder

    • Responder

      • Responder

        • Responder

  6. Responder

  7. By Júnior Gonçalves

    Responder

    • Responder

  8. By israel Nogueira

    Responder

Perguntas duplicadas ou cujo a resposta esteja nos comentários serão ignoradas.
Comentários com códigos serão ignorados(para isso, use o pastebin.com e informe aqui o link).
Faça sua pergunta e "aguarde" ser aprovada para aparecer no blog.
Aguarde sua resposta, ela não é em tempo real, tenha paciência!

Deixe seu comentário

%d blogueiros gostam disto: