fev 11
21
Como criar seu pacote PHAR
Para quem não conhece phar, ou ainda não sabe utilizar, visite um dos seguintes links:
http://www.phpes.org/2011/02/utilizando-arquivos-phar/
http://klaussantana.com/2011/02/utilizando-arquivos-phar/
Para criar ou alterar arquivos phar, você precisa de configurar seu “php.ini” e habilitar a escrita em arquivos phar. Basta mudar a diretiva “phar.readonly” para “1″. Também é necessário que o diretório destino do seu pacote phar tenha permissão de escrita, geralmente um chmod(0777).
A criação de um pacote phar é até um tanto simples:
$package = new Phar("path/myPackage.phar");
Então você já tem um pacote phar para trabalhar. Agora é só começar a adicionar o conteúdo no seu pacote:
$package->addFile("path/to/myFile.php", "new/path/file.php");
Lembrando que o segundo parâmetro deste método é opcional e indica o novo caminho/nome do arquivo dentro do seu pacote phar.
Também existem outros métodos de adicionar arquivos ou conteúdo. Seguem:
$package = new Phar("MyPackage.phar");
$package["/path/to/file.php"] = "<?php php_info(); ?>";
$package->addFile("path/to/my/outside/file.php");
$package->buildFromDirectory("my/package/dir", '/\.php$/');Você pode adicionar arquivos acessando o objeto $package como se fosse uma matriz (array), como pode adicionar o arquivo pelo método addFile() ou então construir seu pacote Phar diretamente de um diretório. Também é possível criar seu pacote por meio de um objeto Iterator. No caso de criar um pacote pelo método buildFromDirectory(), caso não seja interesse adicionar todos os arquivos, você pode especificar uma expressão regular como segundo parâmetro para verificação nos nomes dos arquivos.
Um exemplo de como criar um pacote através de um iterator:
$phar = new Phar("myProject.phar"); $phar->buildFromIterator( new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/path/to/project') ), 'new/path/to/project');
Mesmo você adicionando os arquivos em um pacote phar, o que acontece quando você inclui diretamente o pacote phar?
include "MyPackage.phar";
Neste caso, não acontece nada. Para que um pacote phar execute alguma instrução é necessário você indicar um arquivo de bootsrap (stub) ou indicar uma string contendo os comandos a serem executados.
/* (...) */
$package->setStub('<?php include "app/bootstrap.php"; __HALT_COMPILER(); ?>');
// Ou você pode usar:
$package->setStub($package->createDefaultStub("cli-bootstrap.php", "web-bootstrap.php"));Quando você configura um Stub no seu pacote, ele será executado sempre que você incluir diretamente o pacote phar ou executá-lo através da api cli, na linha de comando. O segundo método de criar um stub utiliza o método createDefaultStub, que pode conter dois parâmetros. O primeiro parâmetro indica qual arquivo será executado por padrão, e caso o segundo parâmtro tenha sido especificado, então o primeiro será para quando o pacote for executado através do cli e o segundo será executado quando o pacote for chamado através do browser.
Lembre-se que todos os stubs é necessário chamar a função __HALT_COMPILER() do php para que não ocorra um loop infinito ou um erro inexperado. Ainda não foi documentado o motivo de um stub requerer esta função.
Para um pacote phar funcionar como um diretório do servidor, você pode utilizar da seguinte forma:
$package = new Phar("myApplication.phar");
$package->buildFromDirectory("./myApplication/");
$package->setStub('<?php Phar::webPhar(); __HALT_COMPILER(); ?>');Isso vai fazer com que seu pacote, ao ser incluido diretamente ou executado através da linha de comando, responda como um servidor, procurando pelo arquivo index.php no diretório que for especificado. Exemplo:
include "myApplication.phar"; include "phar://myApplication.phar/index.php"; /* equivalente a linha anterior */ // ou // include "phar://myApplication.phar/app"; include "phar://myApplication.phar/app/index.php"; /* equivalente a linha anterior */
Existem várias outras maneiras de manipular um arquivo phar, mas o necessário para você começar a criar ótimas aplicações encapsuladas já foi explicado. Agora é com você e sua criatividade.
Você pode ler mais sobre como utilizar o phar através da documentação do php.
E uma observação importante:
O phar possúi capacidade de compactar o pacote com zip, bzip e tar.gz, mas não é possível trabalhar com stubs em pacotes compactados. Por este motivo, pacotes compactados são somente úteis para armazenar recursos para sua aplicação, ou aplicações em que seus arquivos devem ser chamadas manualmente, exemplo:
include "phar://myApp.phar/calculator.php"; include "phar://myApp.phar/sql.php";
Para criar pacotes compactados, basta usar da seguinte forma:
$package = new Phar("myApp.phar"); $package->buildFromDirectory("./dir/to/myApp/"); $package->compress(Phar::GZ /* ou Phar::BZ2 */); /* não é possível utilizar stubs em pacotes compactados */
Mais detalhes em http://www.php.net/manual/en/phar.compress.php.