PHP Phar Konsolentool auf Debian

PHP Phar kann nicht nur über den PHP-Code, sondern auch als Kommandozeilentool benutzt werden. Die Phar Manual Page beschreibt den Umgang damit. Doch wo bekommt man das Tool? Seit PHP 5.3 ist Phar ein Bestandteil der Standard-PHP-Installation. Für eine Version vor 5.3 musste es noch über PEAR installiert werden. Aber anders, als wenn man PHP selber aus dem Source-Code kompilliert, wird Phar Command Line Tool bei einer Installation von PHP als Paket nicht mitgeliefert. Hier möchte ich zeigen, wie das Phar Tool auf Debian aus dem Quelltext installiert werden kann.

1. PHP-Sourcecode herunterladen

Der PHP-Sourcecode kann von GitHub heruntergeladen werden, z.B. so:

$ cd /tmp/
$ git clone git://github.com/php/php-src.git

2. Makefile

Nun muss der Makefile, der das Phar Comman Line Tool installieren soll, (von hier) in den PHP Source-Code Ordner  heruntergeladen werden.

$ cd /tmp/php-src
$ wget http://pastebin.com/download.php?i=UgpaRda1 -O ./Makefile

Um später beim Kompilieren bzw. Ausführen von make Makefile dem Fehler

Makefile:11: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

aus dem Weg zu gehen, muss man alle Leerzeichen-Einrückungen durch echte Tabs ersetzen.

3. Kompilierung

$ mkdir /tmp/phar
$ cd /tmp/php-src
$ make

4. PEAR PHP_Archive

Bei mir wird bei der Kompilierung eine Notice ausgegeben:

$ make
Generating phar.php
Generating phar.phar
PHP Notice:  Undefined index: PATH in /tmp/phar/phar.php on line 707
PHP Stack trace:
PHP   1. {main}() /tmp/phar/phar.php:0
PHP   2. CLICommand->__construct($argc = 19, $argv = array (0 => '/tmp/phar//phar.php', 1 => 'pack', 2 => '-f', 3 => '/tmp/phar//phar.phar', 4 => '-a', 5 => 'pharcommand', 6 => '-c', 7 => 'auto', 8 => '-x', 9 => '\\.svn', 10 => '-p', 11 => '0', 12 => '-s', 13 => '/tmp/php-src/ext/phar/phar/phar.php', 14 => '-h', 15 => 'sha1', 16 => '-b', 17 => '/usr/bin/env php ', 18 => '/tmp/php-src/ext/phar/phar/')) /tmp/phar/phar.php:2089
PHP   3. CLICommand->checkArgTyp($arg = 'p', $i = 11, $argc = 19, $argv = array (0 => '/tmp/phar//phar.php', 1 => 'pack', 2 => '-f', 3 => '/tmp/phar//phar.phar', 4 => '-a', 5 => 'pharcommand', 6 => '-c', 7 => 'auto', 8 => '-x', 9 => '\\.svn', 10 => '-p', 11 => '0', 12 => '-s', 13 => '/tmp/php-src/ext/phar/phar/phar.php', 14 => '-h', 15 => 'sha1', 16 => '-b', 17 => '/usr/bin/env php ', 18 => '/tmp/php-src/ext/phar/phar/')) /tmp/phar/phar.php:189
PHP   4. call_user_func(array (0 => class PharCommand { protected $argc = 19; protected $argv = array (...); protected $cmds = array (...); protected $args = array (...); protected $typs = array (...) }, 1 => 'cli_arg_typ_loader'), '0', array ('typ' => 'loader', 'val' => NULL, 'inf' => '<loader> Location of PHP_Archive class file (pear list-files PHP_Archive).You can use \'0\' or \'1\' to locate it automatically using the mentioned pear command. When using \'0\' the command does not error out when the class file cannot be located. This switch also adds some code around the stub so that class PHP_Archive gets registered as phar:// stream wrapper if necessary. And finally this switch will add the file phar.inc from this package and load it to ensure class Phar is present.', 'required' => FALSE), 'p') /tmp/phar/phar.php:244
PHP   5. PharCommand->cli_arg_typ_loader($arg = '0', $cfg = array ('typ' => 'loader', 'val' => NULL, 'inf' => '<loader> Location of PHP_Archive class file (pear list-files PHP_Archive).You can use \'0\' or \'1\' to locate it automatically using the mentioned pear command. When using \'0\' the command does not error out when the class file cannot be located. This switch also adds some code around the stub so that class PHP_Archive gets registered as phar:// stream wrapper if necessary. And finally this switch will add the file phar.inc from this package and load it to ensure class Phar is present.', 'required' => FALSE), $key = 'p') /tmp/phar/phar.php:244
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
directorytreeiterator.inc
pharcommand.inc
directorygraphiterator.inc
invertedregexiterator.inc
clicommand.inc
phar.inc

Das PEAR-Paket PHP_Archive kann leicht (nach-)installiert werden:

# pear install PHP_Archive-alpha
downloading PHP_Archive-0.11.4.tgz ...
Starting to download PHP_Archive-0.11.4.tgz (83,047 bytes)
....................done: 83,047 bytes
install ok: channel://pear.php.net/PHP_Archive-0.11.4

Doch auch nach der Installation des Pakets endet (bei mir) die Phar-Kompilierung mit der selben Fehlermeldung. Zugleich funktioniert Phar scheinbar unabhängig von PHP_Archive. Jedenfalls kann ich auch beim deinstallierten PHP_Archive Phar-Archive erstellen und auspacken.

5. Phar von überall erreichbar und ausführabar machen

Dazu verschieben wir das unter <span class="inlineCode">/temp/</span> befindliche Verzeichnis <span class="inlineCode">phar</span> ins <span class="inlineCode">/usr/share/</span> (nicht nötig aber sinnvoll) und erstellen im /usr/bin/ einen Symlink zum <span class="inlineCode">/usr/share/phar/phar.phar</span>.
$ mv phar /usr/share/ln -s /usr/share/phar/phar.phar /usr/bin/phar

Fertig ist die Laube! :)

Alles hier Beschriebene bezieht sich auf ein System mit folgenden Parametern:

$ lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 6.0.6 (squeeze)
Release:    6.0.6
Codename:    squeeze

 

 

Comments are closed.