Phar

User Contributed Notes

brunoczim 05-Jul-2017 10:24
Here is a very simple program for creating phar files with CLI. Note that it requires phar.readonly in php.ini  set to false (Off).

<?php
$filename
= "default";
$dir = "./";
$regex = "/^(?!.*build\\.php)(?:.*)$/";
$main = "main.php";
$shebang = "#!/usr/bin/env php";
$chmod = true;

for (
$i = 0; $i < $argc; $i++) {
    switch (
$argv[$i]) {
        case
"-o":
           
$i++;
            if (
$i >= $argc) {
                echo
"Missing output file name" . PHP_EOL;
                exit(
1);
            }
           
$filename = $argv[$i];
            break;
        case
"-i":
           
$i++;
            if (
$i >= $argc) {
                echo
"Missing input directory name" . PHP_EOL;
                exit(
1);
            }
           
$dir = $argv[$i];
            break;
        case
"-p":
           
$i++;
            if (
$i >= $argc) {
                echo
"Missing regular expression pattern" . PHP_EOL;
                exit(
1);
            }
           
$regex = $argv[$i];
            break;
        case
"-m":
           
$i++;
            if (
$i >= $argc) {
                echo
"Missing main file" . PHP_EOL;
                exit(
1);
            }
           
$main = $argv[$i];
            break;
        case
"-b":
           
$i++;
            if (
$i >= $argc) {
                echo
"Missing shebang of file" . PHP_EOL;
                exit(
1);
            }
           
$shebang = $argv[$i];
            break;
        case
"--no-chmod":
           
$chmod = false;
            break;
    }
}
if (
file_exists($filename)) unlink($filename);
$phar = new Phar($filename);
$phar->buildFromDirectory($dir, $regex);
$phar->setStub(($shebang ? $shebang . PHP_EOL : "") . $phar->createDefaultStub($main));
if (
$chmod) {
   
chmod($filename, fileperms($phar) | 0700);
}
t dot habenreich at web dot de 17-Dec-2013 05:38
Here is a very simple class to build a phar file from a given source directory. You can use this for your own project and simple deployment.

But my main goal was to show how to use PHAR functions in a simple way.

<?php

class BuildPhar
{
  private
$_sourceDirectory = null;
  private
$_stubFile        = null;
  private
$_outputDirectory = null;
  private
$_pharFileName    = null;

 
/**
   * @param $_sourceDirectory       // This is the directory where your project is stored.
   * @param $stubFile               // Name the entry point for your phar file. This file have to be within the source
   *                                   directory.
   * @param null $_outputDirectory  // Directory where the phar file will be placed.
   * @param string $pharFileName    // Name of your final *.phar file.
   */
 
public function __construct($_sourceDirectory, $stubFile, $_outputDirectory = null, $pharFileName = 'myPhar.phar') {

    if ((
file_exists($_sourceDirectory) === false) || (is_dir($_sourceDirectory) === false)) {
      throw new
Exception('No valid source directory given.');
    }
   
$this->_sourceDirectory = $_sourceDirectory;

    if (
file_exists($this->_sourceDirectory.'/'.$stubFile) === false) {
      throw new
Exception('Your given stub file doesn\'t exists.');
    }

   
$this->_stubFile = $stubFile;

    if(empty(
$pharFileName) === true) {
      throw new
Exception('Your given output name for your phar-file is empty.');
    }
   
$this->_pharFileName = $pharFileName;

    if ((empty(
$_outputDirectory) === true) || (file_exists($_outputDirectory) === false) || (is_dir($_outputDirectory) === false)) {

      if (
$_outputDirectory !== null) {
       
trigger_error ( 'Your output directory is invalid. We set the fallback to: "'.dirname(__FILE__).'".', E_USER_WARNING);
      }

     
$this->_outputDirectory = dirname(__FILE__);
    } else {
     
$this->_outputDirectory = $_outputDirectory;
    }

   
$this->prepareBuildDirectory();
   
$this->buildPhar();
  }

  private function
prepareBuildDirectory() {
    if (
preg_match('/.phar$/', $this->_pharFileName) == FALSE) {
     
$this->_pharFileName .= '.phar';
    }

    if (
file_exists($this->_pharFileName) === true) {
     
unlink($this->_pharFileName);
    }
  }

  private function
buildPhar() {
   
$phar = new Phar($this->_outputDirectory.'/'.$this->_pharFileName);
   
$phar->buildFromDirectory($this->_sourceDirectory);
   
$phar->setDefaultStub($this->_stubFile);
  }
}
//END Class

//Example Usage:
$builder = new BuildPhar(
 
dirname(__FILE__).'/_source',
 
'my_default_stub.php',
 
dirname(__FILE__).'/_output',
 
'my-phar-file.phar'
);
dava 03-Jun-2013 06:18
Here is an apache2 htaccess example that prevents the downloading of phar-Archives by the user:

RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]

It triggers a "403 - Forbidden" message instead of delivering the archive.
v-mafick at microsoft dot com 25-May-2013 06:22
Users should set the `sys_temp_dir` directive.

PHAR stores temporary files in either `sys_temp_dir` or the current working directory(CWD).

This is especially important if you're CWD is on a remote file system. Often web server clusters will share a common file system between each web server (using NFS, DFS, etc...). In such scenarios, if you don't set `sys_temp_dir` to a local directory, PHAR will be creating temporary files over the network, which will result in performance and functionality problems.
bohwaz 21-Nov-2011 11:43
If you get blank pages when trying to access a phar web-page, then you probably have Suhosin on your PHP (like in Debian and Ubuntu), and you need to ad this to your php.ini to allow execution of PHAR archives :

suhosin.executor.include.whitelist="phar"