Mon DS d'éco-droit ayant été littéralement... Foiré, et n'ayant pas envie de réviser mes maths pour demain, je décide de consacrer un article
toujours aussi simpliste qui traitera de Bambalam.
Non, ce n'est pas de la musique. Voici, d'ailleurs, en premier lieu, l'URL du site du projet :
http://www.bambalam.se/bamcompile/On voit en gros sur la page :
Bambalam PHP EXE Compiler/Embedder
Alors que PHP est censé être un langage interprété, on peut le compiler pour :
- Masquer du code ;
- Faire des applications windows portables ;
- (théoriquement) accroître la vitesse d'exécution.
Elle est pas belle, la vie ?
Et puis, si vous utilisez linux, il y a la source du projet à télécharger !
Allez, on télécharge l'archive, on l'extrait dans un dossier, et on regarde le contenu :
- readme.txt : on passe ;
- project_template.bcp : on passe ;
- bamcompile.exe : le fichier qui va recevoir plein d'arguments pour "compiler" notre php ;
- examples : un dossier contenant plein d'exemples intéressants. Je vous laisse regarder.
Pour nous mettre à l'aise, créons un dossier
projets. Dans ce dossier projets, créons un dossier
hello et allons dans celui-ci. Maintenant, dans ce dossier, créons un fichier nommé
hello.php Et mettons-y le code suivant :
<?php
echo 'Hello!';
?>
Il va maintenant falloir le compiler. Tout d'abord, vous avez le choix entre :
- Aller en ligne de commande pour vous déplacer dans le dossier de bambalam puis rentrer vos options à la main ;
- Faire un fichier batch qui va exécuter de façon séquentielle vos commandes et en garder une trace.
Pour ma part, je penche pour la seconde option.
Voyons ce qu'on nous dit sur le site du projet :
Usage:
bamcompile [-options] infile.php [outfile.exe]
bamcompile [-options] project_directory mainfile.php [outfile.exe]
bamcompile projectfile.bcp
Options:
-w Hide console window for windowed applications
-c Compress output exe (using UPX)
-d Do not encode PHP files
-e:extension.dll Embed and use PHP extension
-i:icon.ico Add icon to exe
Testons la première ligne pour compiler notre unique fichier PHP ! Créons un fichier nommé
make.bat dans le dossier courant, et mettons-y les lignes de code suivantes :
@echo off
"../../bamcompile.exe" hello.php
rem On va éviter de fermer la console automatiquement
pause
Eh oui, il faut veiller à mettre ../../ pour remonter dans le dossier parent ; je ne vous prends pas pour des imbéciles non plus, mais pensons-y par réflexe !
On lance
make.bat et on n'a même pas le temps de dire "Agaga poireau." :
Bambalam PHP EXE Compiler/Embedder 1.21
Mainfile: hello.php
Outfile: hello.exe
Encoding and embedding hello.php
hello.exe created successfully!
Appuyez sur une touche pour continuer...
On a un superbe exécutable qui s'est créé dans le même dossier. On l'ouvre, et il se ferme à la vitesse de l'éclair ; normal.
On va voir ce que ça donne en ligne de commande :
C:\bamcompile1.21\projets\hello>hello.exe
Hello!
La classe, Matias !
Bon, ok, y'a une ligne vide au-dessus de notre phrase, mais on s'en fout pas mal.
Revenons dans le dossier projets, faisons un second dossier nommé
age. On va dedans, et on va créer deux fichier :
- main.php (le fichier principal)
<?php
require_once('age.php');
if($_SERVER['argc'] < 2) {
echo "Utilisation : ".$_SERVER['argv'][0]." [nombre]\n";
exit(-1);
}
echo AfficherSuivantAge(abs($_SERVER['argv'][1]));
?>
J'explique le code vite fait. On commence par inclure le fichier age.php (qu'on va écrire après), on vérifie qu'on a entré l'argument en ligne de commandes - qui correspond à l'âge d'une personne - et, en suite, on appelle la fonction AfficherSuivantAge() qui sera définie dans le fichier age.php. Enfin, la fonction intval() permet de s'assurer que l'argument sera une valeur numérique, et abs() pour qu'elle soit positive (vous avez déjà vu des gens âgés de -15 ans ? Tss... Menteurs !)
Passons au fichier age.php :
<?php
if(!defined("AGE_PHP")) {
define("AGE_PHP",TRUE);
function AfficherSuivantAge($var) {
return $var >= 18 ? "Tu es majeur" : "Tu es mineur";
}
}
?>
En bref, je protège le fichier des inclusions multiples (même si ça sert pas à grand-chose ici) et je définis ma fonction. Car, si on définit la fonction avec le même nom plus d'une fois, ça plante ; normal. La fonction retourne une chaîne de caractère :
- "Tu es majeur" si l'âge est supérieur ou égal à 18 ;
- "Tu es mineur" si l'âge est strictement inférieur à 18.
Pour ceux qui ne comprennent pas le principe de l'instruction ternaire, elle consiste à affecter une valeur à une variable suivant une condition. Exemple :
$variable = condition ? "valeur_si_condition_vraie" : "valeur_si_condition_fausse";
Ca me rappelle la terminale, où on faisait du C en électronique logique. J'ai utilisé des instructions ternaires, et le prof m'a sorti "Mais, ça, c'est pas du C !". Enfin, bref. (xD)
Le code équivalent est le même que pour l'exemple ci-dessus :
if(condition)
$variable = "valeur_si_condition_vraie";
else
$variable = "valeur_si_condition_fausse";
Une ligne pour l'instruction ternaire ; quatre pour le test de condition ci-dessus. Ca explique pourquoi j'ai choisi l'expression ternaire.
Mais enfin, ne dérivons pas du sujet.
Maintenant, ce que nous allons faire, c'est revenir dans le dossier où se trouve bamcompile.exe. Créons un fichier nommé
make_age.bat et mettons-y le code suivant :
@echo off
bamcompile.exe projets/age main.php projets/age/age.exe
pause
En effet, sur le site de bambalam, on nous dit qu'on peut utiliser :
bamcompile [-options] project_directory mainfile.php [outfile.exe]
Par identification :
project_directory = projets/age ;
mainfile.php = main.php ;
outfile.exe (argument optionnel) = projets/age/age.exe
On lance donc notre fichier batch et c'est l'extase (normalement !).
Bambalam PHP EXE Compiler/Embedder 1.21
Mainfile: main.php
Outfile: projets/age/age.exe
Project dir: projets/age
Embedding age.exe
Encoding and embedding age.php
Encoding and embedding main.php
projets/age/age.exe created successfully!
Appuyez sur une touche pour continuer...
On va exécuter age.exe en CLI :
C:\bamcompile1.21\projets\age>age.exe 18
Tu es majeur
C:\bamcompile1.21\projets\age>age.exe 16
Tu es mineur
C:\bamcompile1.21\projets\age>age.exe aaa
Tu es mineur
C:\bamcompile1.21\projets\age>age.exe -4
Tu es mineur
C:\bamcompile1.21\projets\age>age.exe -18
Tu es majeur
C:\bamcompile1.21\projets\age>age.exe 32
Tu es majeur
Ok, le programme n'a pas beaucoup d'intérêt, mais c'est déjà un bon exemple !
J'ai le regret de vous annoncer que le tour de manège est terminé. Disons que cet article m'a occupé à vous présenter un outil que j'adore vraiment (j'ai pu envoyer un exe sympathique à une copine, y'a longtemps) et qui m'amuse toujours autant !
Regardez la section examples, ça vaut le coup. Il y a même un exemple de calculatrice codée avec winbinder - extension PHP pour faire de l'interface graphique. Bref, tout cela pour dire que ça vaut absolument le coup pour ceux qui font des scripts PHP en CLI et qui voudraient les partager avec des utilisateurs qui n'ont pas forcément PHP d'installé sur leur ordinateur.
C'est tout. A la revoyure !
Geo