Transformar qualquer Script em um arquivo Executável (.exe)
por Ronaldo Menezes

Irei explicar como compilar um script PHP num arquivo executável pelo uso do Bamcompile.




Por diversas vezes confrontei-me com as seguintes situações :
- deixar uma aplicação desenvolvida / site no cliente e não ter como proteger o código.
- Depender do browser para execução de script’s
- Depender de utilizar o script via comannd line

Seja por motivo de protecção ao código ou por dar maior agilidade ao processo , hoje utilizo “Bancompile” , script que permite a transformação de qualquer script em um arquivo executável .Após a transformação posso usar o arquivo executável em um “ Scheduler” ou pedir a execução via php utilizando funcoes como “exec” ou “passtrhu”, as quais permitem a execução de um programa externo.

Compilador( “termo usado no mainframe , indica que um programa tem sua sintaxe verificada e ja encontra-se pronto para ser transformado em executável)

Como exemplo, explicarei o script abaixo onde utilizei o compilador para gerar o executável e dar agilidade ao processo de gerar perto de 1300 gráficos dinamicamente.
Neste script utilizo a class “JPGRAPH” , a qual não vou explicar neste artigo.
Os gráficos após serem gerados fazem parte de uma aplicação onde podem ser vistos sem serem gerados no momento pois foram gerados em "background".

Script compilado.php:

<?php
set_time_limit
(0);
$datah date("Y-m-d");
// class jpgraph
include("jpgraph.php");
include(
"jpgraph_line.php");
// conexao
$link mysql_connect("ip""user""password")
        or die(
"Não pude conectar: " mysql_error());
mysql_select_db("db") or die("Não pude selecionar o banco de dados");

$sql "SELECT * FROM disco ORDER BY volume";
$resulta mysql_query($sql);
$num_rows mysql_num_rows($resulta);
$tamanho =  $num_rows ;
while (
$row mysql_fetch_array($resulta)) {
    
$vol[] = $row["volume"];
}
for (
$i 0$i <= $tamanho 1$i++) {
    
$rep str_replace('#''_'$vol[$i]);
    
$query "SELECT DISTINCT
                  data,
                  volume,
                  free_percent
              FROM
                  discodia
              WHERE
                  volume = '$vol[$i]' AND
                  data > '$datah'
              ORDER BY
                  data,
                  volume"
;
    echo 
$query "\n";
    
$result mysql_query($query)    ;
    
$linhas =  mysql_num_rows($result);
    
// se existe conteudo monta grafico
    
if ($linhas 1) {
        if (
$myrow mysql_fetch_array($result)) {
            do {
                
$datax[] = $myrow["data"];
                
$volx[] = $myrow["volume"];
                
$ydata[] = $myrow["free_percent"];
            } while (
$myrow mysql_fetch_array($result));
        }
        
// Create the graph. These two calls are always required
        
$graph = new Graph(800200,"DISCO.".$rep.".JPG");
        
$graph->SetScale"textlin");
        
$tit "Percentual Free Space no volume  - " $vol[$i] ;
        
$graph->title->Set($tit);
        
$graph->SetMarginColor("azure");
        
$graph->xaxis->SetTickLabels($datax);
        
//$graph->xaxis->SetTextLabelInterval(5);
        
$graph->xaxis->SetFont(FF_ARIAL,FS_NORMAL,8);
        
$graph->xaxis->SetLabelAngle(45);
        
$graph->img->SetMargin(45,30,30,80);
        
$graph->SetShadow();
        
//$graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5');
        // Create the linear plot
        
$lineplot =new LinePlot($ydata);
        
$lineplot ->SetColor("darkblue");
        
//$lineplot->value->Show()  ;

        // Add the plot to the graph
        
$graph->Add$lineplot);
        
        
// Display the graph
        
$graph->Stroke("DISCO.".$rep.".JPG");
        unset(
$datax);
        unset(
$volx);
        unset(
$ydata);
    }
}
?>


Utilização do “Bamcompile”

Através de um arquivo .BAT crio o executável conforme descrito na documentação no site do Bamcompile.


bamcompile [-options] infile.php [outfile.exe]
bamcompile [-options] project_directory mainfile.php [outfile.exe]
bamcompile projectfile.bcp

Opções: ( Ver no site acima documentação)
    -w 
    -c  
    -d 
    -e:extension.dll Embed and use PHP extension
    -i:icon.ico Add icon to exe


O Arquivo utilizado (dll) encontra-se em php/extensions, neste caso como a intenção é gerar gráficos utilizei GD.

compilado.bat:

bamcompile -e  php_gd2.dll compilado.php
pause


Resultado :

Compilado.exe


Observar que um pequeno script fica com o tamanho de muitos KB, pois no executável esta incluso “php.exe”.

Bamcompile: http://www.bambalam.se/bamcompile/
Suporte a PHP 4 somente.

Ronaldo Menezes