2.5 KiB
Phar Applications
This guide explains how to make single-file executables using MakePhar.
The workflow
- Make sure you have a native php loader, in this example
src/stub.php
. If you include a bin, such asbin/myapp
make sure it wraps the native loader or the shebang (#!/usr/bin/env php
or similar) will be output during load. - Set up the
makephar.sdl
file. You can copy and modify the example in this doc, themakephar.sdl.dist
from the source package, or simply usemakephar -n > makephar.sdl
to have a template generated for you. - Call on
makephar
to generate the output file.
Example files
src/stub.php
<?php
require_once __DIR__."/../vendor/autoload.php";
$app = new MyApp\MyApp();
$app->run();
makephar.sdl
phar "myapp.phar" {
stub "src/stub.php";
include {
dir "src";
dir "vendor";
}
exclude {
dir ".git";
}
}
Problems and Solutions
Getting the directory of the running phar
You can get the path of the command invoked using $_SERVER['SCRIPT_NAME']
:
$root = dirname($_SERVER['SCRIPT_NAME']);
Note that the script can be a symbolic link, in which case you need to call
on readlink
before you call dirname
:
// Get the path of the script, eg. /usr/bin/myapp
$root = $_SERVER['SCRIPT_NAME'];
// Unwrap the links, eg. /usr/bin/myapp -> ~/myapp/myapp.phar
while (readlink($root)) {
$root = readlink($root);
}
// Finally get the directory (~/myapp)
$root = dirname($root);
Use this to locate your plugins.
Find out if running from within a Phar
You can easilly find out if running from within a .phar archive by calling
Phar::running()
.
if (Phar::running()) { inside_phar(); }
This doesn't make sense to use in phar plugins, as the main application can also be in a phar, in which case it will be true even for non-phar plugins.
Including the Git revision etc
Use the props
for this. If you have an executable file, say build/genprops
that look like this...
#!/bin/bash
printf "GIT_REVISION=%s" "$(git describe --tags)"
...then you can define it in your makephar.sdl
to be evaluated when the
phar is being built:
phar "output.phar" {
...
stub exec="build/genprops";
...
}
When running from within the built phar, the define GIT_REVISION
will be
available:
if (defined('GIT_REVISION')) {
echo "Git Revision: ".GIT_REVISION."\n";
}