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
Muito bom, esclareceu totalmente como funciona essa função.
vlw!
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com