downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

bcompiler_load_exe> <bcsub
[edit] Last updated: Mon, 01 Nov 2010

view this page in

VIII. Compilateur bytecode pour PHP

Introduction

Avertissement

Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez ce module à vos risques et périls.

Bcompiler a été écrit pour plusieurs raisons :

Pour encoder un script complet dans une application PHP propriétaire
Pour encoder des classes et/ou des fonctions dans une application PHP propriétaire
Pour permettre d'utiliser des applications php-gtk sur des bureaux clients sans avoir besoin du fichier php.exe.
Pour rendre faisable de convertir un code PHP en C

Le premier de ces buts est réalisé en utilisant les fonctions bcompiler_write_header(), bcompiler_write_file() et bcompiler_write_footer(). Les fichiers de bytecode peuvent être écris en non-compressés ou en texte plein. Pour utiliser le bytecode généré, vous pouvez simplement l'inclure avec les structures include ou require.

Le second but est atteint en utilisant les fonctions bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read() et bcompiler_load(). Les fichiers bytecode peuvent être écris en non-compressés ou en texte plein. La fonction bcompiler_load() lit un fichier bytecode compressé bzippé, qui tend à avoir un taille d'1/3 par rapport au fichier original.

Pour créer des fichiers du type EXE, bcompiler doit être utilisé avec un fichier sapi modifié ou une version de PHP qui a été compilé en tant que bibliothèque partagée. Dans ce cas, bcompiler lit le bytecode compressé depuis la fin du fichier exe.

bcompiler peut augmenter d'environ 30% ces performances lorsqu'il est utilisé avec uniquement du bytecode non-compressé. Mais gardé en mémoire que le bytecode non-compressé peut être 5 fois plus long (voir plus) que le code source original. Utiliser la compression bytecode peut vous permettre de réduire l'espace disque mais la décompression requiert plus de temps que de parser simplement le code source. bcompiler n'effectue aucune optimisation du bytecode, cette fonctionnalité pourra être ajoutée dans le futur...

bcompiler n'est pas susceptible d'améliorer les performances d'exécutions, car il ne fait que dévier l'étape de compilation du processus courant PHP et la rempalce par le processus d'importation dans bcompiler. Il n'optimise pas le bytecode, ce qui pourrait être ajouté dans le futur.

En terme de sécurité du code, il est possible de dire qu'il est impossible de recréer le code source exact depuis lequel il a été construit et sans les commentaires accompagnant le code source. Il serait inefficace d'utiliser bcompiler pour recréer et modifier une classe. Malgrès tout, il reste possible de récupérer les données depuis un fichier bytecode encodé avec bcompiler, donc, n'y mettez pas vos mots de passe ou toute autre donnée de ce genre.

Installation

Note succincte d'installation :

  • Vous avez besoin d'au moins PHP 4.3 pour que la compression fonctionne

  • Pour l'installer sur PHP 4.3 et suivant, à l'invite de commande Unix, tapez la commande : pear install bcompiler

  • Pour l'installer sous Windows, tant que le mécanisme de distribution de paquets n'est pas temriné, merci de rechercher dans les archives de la liste de diffusion pear-general les paquets pré-construits. (ou envoyer un email sur cette liste si vous ne trouvez aucune référence)

  • Pour l'installer sur une version plus ancienne, vous devez effectuer quelques modifications à la construction.

  • décompressez l'archive bcompiler.tgz dans le dossier php4/ext. (récupérez le directement depuis PECL http://pecl.php.net/get/bcompiler)

  • Si le nouveau dossier porte un nom comme bcompiler-0.x, alors, renommez le en bcompiler (mise à part si vous voulez le construire comme module php autonome).

  • Si vous utilisez une version plus ancienne que PHP 4.3, vous devez copier le fichier Makefile.in.old dans Makefile.in et le fichier config.m4.old dans config.m4.

  • exécutez la commande phpize dans le dossier ext/bcompiler

  • exécutez la commande ./buildconf dans le dossier php4

  • exécutez la commande configure avec l'option --enable-bcompiler (ainsi que vos autres options)

  • make; make install

  • that's it.

Contact

Si vous avez des commentaires, des corrections de bogues, des améliorations ou que vous voulez aider à rendre cette extension meilleure, vous pouvez envoyer un email à alan_k@php.net. Toute aide est vraiment la bienvenue.

Table des matières
bcompiler_load_exe --  Lit et crée des classes depuis un fichier exe bcompiler
bcompiler_load -- Lit et crée les classes depuis un fichier compressé bzippé
bcompiler_parse_class --  Lit le bytecode d'une classe et revient à une fonction utilisateur
bcompiler_read -- Lit et crée les classes depuis un descripteur de fichier
bcompiler_write_class -- Ecrit une classe définie en bytecode
bcompiler_write_constant -- Ecrit une constante définie comme bytecode
bcompiler_write_exe_footer --  Ecrit à la position start et jusqu'à la fin du fichier de type exe
bcompiler_write_file -- Ecrit un code source PHP sous forme de bytecodes
bcompiler_write_footer --  Ecrit le caractère \x00 pour indiquer la fin des données compilées
bcompiler_write_function -- Ecrit une fonction définie sous forme de bytecode
bcompiler_write_functions_from_file -- Ecrit toutes les fonctions définies dans un fichier sous forme de bytecode
bcompiler_write_header -- Ecrit l'en-tête bcompiler


bcompiler_load_exe> <bcsub
[edit] Last updated: Mon, 01 Nov 2010
 
add a note add a note User Contributed Notes Compilateur bytecode pour PHP
mail - at- albertkok - dot - com 01-Oct-2009 04:06
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
codeslinger+uph80111 at compsalot dot com 11-Jan-2008 09:16
try this, I believe that it will solve the problem with __FILE__

<?php

   
eval("\$Foo = dirname(__FILE__);");
    echo
"\n<br>FILE = '$Foo'\n";

?>
Albert Kok 24-Oct-2007 04:08
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
roberto at spadim dot net dot br 24-Jun-2007 10:33
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
cdsheen+bencoder at gmail dot com 25-Jul-2006 05:58
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)
arplynn at gmail dot com 28-Apr-2006 08:49
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.
tda at example dot com 07-Feb-2006 05:50
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.

 
show source | credits | sitemap | contact | advertising | mirror sites