It's been a while since my past post, but yes, I'm still using bcompiler. I just found another problem that I think you should be aware of. It took me hours to find.
It pretty much comes to this: When compiling on a 64-bit Linux operating system, your compiled code will NOT run on a 32-bit version, and visa versa. It will merely echo the file's content.
Regards,
Albert Kok
VIII. Compilador de PHP bytecode
Introdução
| Atenção |
Este módulo é EXPERIMENTAL. Isso quer dizer que o comportamento neste módulo --- incluindo suas funções e seus nomes, e TUDO mais que está documentado sobre esse módulo --- poderá mudar em futuras versões do PHP, SEM QUALQUER NOTIFICAÇÃO. Esteja avisado, e use este módulo por sua própria conta e risco. |
Bcompiler foi escrito por várias razões:
| Para codificar script em uma aplicação PHP proprietária |
| Para codificar algumas classes e/ou funções em uma aplicação PHP proprietária |
| Para disponibilizar a produção de aplicações php-gtk que poderiam ser usadas em clientes desktops, sem precisa do php.exe. |
| Para estudar a possibilidade de fazer um conversor de PHP para C |
O segundo desses objetivos é alcançado usando as funções bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read(), e bcompiler_load(). Os arquivos bytecode podem ser escritos ou como não-compactados ou planos. O bcompiler_load() lê um arquivo compactador bzip que contem bytecodes, o que tende a ser 1/3 do tamanho original do arquivo.
Para criar arquivos do tipo EXE, bcompiler tem que ser usado com um arquivo de SAPI modificado ou uma versão do PHP que tenha sido compilada como uma biblioteca compartilhada. Nesse cenário, bcompiler ler o bytecode compactador do fim do arquivo executável.
bcompiler pode aumentar performance em volta de 30% quando usado com bytecodes não-compactados apenas. Mas lembre-se que bytecode não-compactado pode ser até 5 vezes maior que o código-fonte original. Usar compactação de bytecode pode evitar gasto de espaço, mas descompactar requer muito mais tempo do que avaliar um fonte. bcompiler também não faz nenhuma otimização de bytecode, isso pode ser acrescentado no futuro...
Em termos de proteção de código, é seguro dizer que é seria impossível recriar o código-fonte exato do qual ele foi criado, e sem os comentários acompanhando o código-font. Seria efetivamente inútil usar o bcompiler para recriar ou modificar uma classe. No entanto, é possível recuperar dados de um arquivo bytecode compactado - então não ponha suas senhas pessoais ou coisa do tipo nele.
Instalação
Nota curta de instalação:
Você precisa de pelo menos o PHP 4.3. para a compressão funcionar
Para instalar no PHP 4.3 e superior no shell do unix digite pear install bcompiler
Para instalar no Windows, até o mecanismo de distribuíção de pacotes binários estiver completo, favor procure os arquivos da lista de discussão pear-general pelos pacotes pré-compilados. (ou mande um e-mail para a lista de você não conseguir achar uma referência).
Para instalar em versões mais antigas, você precisa fazer algumas pequenas alterações ao binário compilado.
untar o arquivo bcompiler.tgz no diretório php4/ext.(Pegue o diretamente da PECL http://pecl.php.net/get/bcompiler)
Se o novo diretório for chamado algo como bcompiler-0.x, então você deve renomeá-lo para bcompiler (exceto se você só quiser compilá-lo como um módulo do php auto-contido).
Se você estiver usando versões anteriores ao PHP 4.3, você terá que copiar os arquivos Makefile.in.old para Makefile.in e config.m4.old para config.m4.
execute phpize no diretório ext/bcompiler
execute ./buildconf no diretório php4
execute o script configure com a opção --enable-bcompiler e as suas outras opções
make; make install
E por hoje é só pessoal.
Informação para contatos
Se você tiver comentários, resoluções de bugs, melhoramentos ou quer ajudar a desenvolver essa fera, você pode me enviar um e-mail para alan_k@php.net. Qualquer ajuda é muito bem-vinda.
- Índice
- bcompiler_load_exe -- Lê e cria classes a partir de um arquivo exe do bcompiler
- bcompiler_load -- Lê e cria classes a partir de um arquivo compactado pelo bzip
- bcompiler_parse_class -- Lê o bytecode de uma classe e chama para uma função do usuário
- bcompiler_read -- Lê e cria uma classe a partir de um handle de arquivo
- bcompiler_write_class -- Escreve uma classe definida como bytecode
- bcompiler_write_constant -- Escreve uma constante definida como bytecodes
- bcompiler_write_exe_footer -- Escreve na posição de início e continua até o fim do arquivo de tipo EXE
- bcompile_write_file -- Escreve um arquivo-fonte do PHP como bytecodes
- bcompiler_write_footer -- Escreve o caracter \x00 para indicar o Fim dos dados compilados
- bcompiler_write_function -- Escreve uma função definida como bytecodes
- bcompiler_write_functions_from_file -- Escreve todas as funções definidas em um arquivo como bytecodes
- bcompiler_write_header -- Escreve o cabeçalho do bcompiler
try this, I believe that it will solve the problem with __FILE__
<?php
eval("\$Foo = dirname(__FILE__);");
echo "\n<br>FILE = '$Foo'\n";
?>
A few notes to succesfully configure PHP5 to load bcompiler.
In case of using Debian/Ubuntu Linux: When installing from the PECL (PEAR) package, make sure you have the php5-dev library installed in your system (apt-get install php5-dev).
Newer versions of Ubuntu may error out while installing bcompiler thru PECL, asking you to reinstall bzip2. This will not fix the installation. Instead, install the libbz2-dev library (apt-get install libbz2-dev) and try installing bcompiler from PECL again.
After installing bcompiler from PECL, don't forget to make sure you load the bcompiler.so library in your PHP configuration for the new bcompiler functions to become available. This is done by adding the following line to the bottom of your php.ini file(s):
extension=bcompiler.so
If you were to use the bcompiler functions thru your webserver, you need to restart it to reload the php configuration.
Regards,
Albert Kok
hello guys, since bencoder don't work for __FILE__ constants i have a bcompiler script working, anyone that want it can send me an email
the source is 100% compatible with original file, the only problem is php5 new function methods that
<?
if (!function_exists('function_name')){
function function_name()
}
?>
don't work but it's a php5 new method for understand bytecode
Here's a script to act as a front-end for bcompiler, which may be very similar to the eA ones:
http://bbs.giga.net.tw/bencoder.php
BENCODER v1.1 - Encode your PHP script using bcompiler
Usage: bencoder [-f] -o FILE file1.php
bencoder [-f] -o OUTDIR file1.php file2.php ...
bencoder [-f] -o OUTDIR -a SRCDIR [-s SUFFIX] [-c] [-r]
-f : force overwriting even if the target exists
-o FILE : the file name to write the encoded script
(default to '-encoded.php' suffix)
-o OUTDIR : the directory to write all encoded files
-a SRCDIR : encode all files in this source directory
-s SUFFIX : encode the files with the SUFFIX extension only (default: php)
-c : copy files those shouldn't be encoded (no by default)
PHP seems to choke on trying to compile PHP5 classes with the private, protected or public modifiers. Additionally, when including files with properly compiled classes on PHP5, it works fine but when php tries to exit it throws a segmentation fault.
It's just not a great idea to use bcompiler for anything other than functions on PHP5, at least for now.
Creating a function after checking if a function exists using function_exists will result in a "Zero Sized Reply" error.
<?php
this does NOT work any longer:
if (!function_exists("file_get_contents")) {
function file_get_contents($filename, $use_include_path = 0)
{ /*...define your own function here...*/ }
}
?>
Apache returns: "Zero Sized Reply" after compilation.
