Script PHP com Dados Binários

Artigo que explica como criar scripts PHP que contém sequências binárias em seu interior, utilizando o recurso __hald_compiler e a constante mágica __COMPILE_HALT_OFFSET__.

Existe um mecanismo do PHP que permite embutir trechos de dados (inclusive dados binários) que não serão sequer interpretados pelo interpretador de PHP. Diferente do comando "exit", que interrompe a execução do script, mas não interrompe o parser do PHP, existe o comando "__halt_compiler", que ignora absolutamente tudo que esteja abaixo do ponto em que foi chamado.

A utilização deste recurso é pouco comum, mas permite, por exemplo:

  • Criação de scripts PHP auto-extratores (anexa um pacote de dados ao script)
  • Criação de arquivos que exigem autenticação para acesso, mas ficam em uma área pública na Web
  • Armazenar meta-informações sobre o script PHP.

O ideal, é que o próprio script consiga "ler" o que vem depois do ponto em que foi chamado o "__halt_compiler". Para tanto, existe uma constante especial chamada __COMPILER_HALT_OFFSET__, que guarda a posição do primeiro byte que está após a chamada do __halt_compiler().

Veja um exemplo bem simples:

<?php

// Abrir o proprio arquivo para leitura
$f = fopen(__FILE__, 'r');

// Posicionar o cursor na posicao do __halt_compiler() + 1
// (+1 pois existe a quebra de linha)
fseek($f, __COMPILER_HALT_OFFSET__ + 1);

// Ler todo conteudo do cursor ate o final do arquivo e fecha-lo
$conteudo = stream_get_contents($f);
fclose($f);

// Fazer algo com o conteudo
echo $conteudo;
exit(0);


__halt_compiler();
tudo que vem aqui é ignorado!
blá blá blá

A sintaxe do trecho posterior a __halt_compiler() nem é avaliada.

A dúvida é: por que não jogar o conteúdo desejado em uma variável do PHP e usar quando precisar dele? Muito simples: as vezes o conteúdo é muito grande e inviável de se colocar todo em memória (pode estourar o limite de memória). Usando o recurso mostrado, é possível ler o arquivo aos poucos.

Outra dúvida: se colocar conteúdo binário no final do arquivo, como poderei editar o arquivo? Bom, o ideal é que primeiro seja criado o arquivo e, depois, com algum comando que concatena arquivos, anexar o trecho binário. Lembrando que no arquivo PHP já deve estar presente o "__halt_compiler();" na última linha do arquivo e sem espaços ou linhas após.

1 comentário