Главная » Полезные статьи » Язык PHP » Phar в PHP: преимущества и работа с PHAR
Распечатать статью

Phar в PHP: преимущества и работа с PHAR

Phar в PHPСегодня мы познакомимся с понятием phar архивов, и их использовании в PHP. Зачем они нужны? Если вы пишите PHP приложение, которое направлено на развитие, то вы обязательно столкнетесь с такой проблемой. У вас будут происходить накопления PHP файлов, которые некуда будет девать. Предположим, тысяча или несколько тысяч файлов, которые занимают место. К тому же такое количество файлов, очень сложно загружать на хостинг, по FTP. Выходом из данной ситуации, будет использование phar архивов.

Что такое Phar?

Phar – это приложение, позволяющее создавать архивы из файлов PHP проекта. Он пакует файлы в одну библиотеку, которую можно будет подключить и использовать, как один файл. Поэтому, cпомощью phar, мы можем значительно сократить код подключения файлов в php приложение, и упростить задачу сохранения файлов. Phar может работать с такими форматами, как tar, zip, bzip2 и phar. Эта утилита способна: создавать, читать, дописывать архивы и конвертировать один архив в другой. Такой принцип работы, доступен в других языках программирования, таких как DLL, N#, VB.Net, или jar файлы java. Чтобы узнать, как использовать phar в php, читайте раздел требования к PHP.

Доступ к исходным файлам архива осуществляется напрямую, без распаковки архива. Прямой доступ обеспечивает PHP Stream Wrapper. Другими словами с файлами архива работают функции поддерживаемые PHP Stream Wrapper.

Требования к PHP версии

Расширение phar, доступно с версии PHP 5.2. А с версии 5.3 – это неотъемлемая часть PHP. Для начала, советую вам проверить версию PHP. Если версия ниже, меняйте. Если версия PHP не ниже 5.2 – вам необходимо переустановить PHP ядро с Phar, Zlib и bzip2 расширениями. Если у вас версия 5.3 – все отлично, phar установлен по умолчанию.

Если хотите, можете настроить защиту для ваших phar архивов, и сделать их доступными, только для чтения. Для этого, нужно установить настройку в файле php.ini. Установите следующий параметр phar.readonly = 0.

Преимущества Phar в PHP

PHAR легко устанавливается, а если точнее — он входит в стандартную поставку PHP 5.3.

Легко использовать.

Удобно при копировании файлов на другой хост.

Легко разворачивать — всего один файл.

Высокая степень защиты PHP приложения — сигнатуры, OpenSSL.

Обладает высокой производительностью.

Работа с Phar в PHP

В этом разделе, мы будем работать с утилитой. А точнее, будем создавать и использовать собственные библиотеки файлов PHP приложения. Вы увидите, насколько просто и удобно использовать phar библиотеки.

Пример Hello World

Для начала создадим простой архив, с текстовым файлом:

$phar = new Phar(‘test.phar’);
$phar[hello_world.txt] = ‘Hello World!’;

А теперь, прочитаем его:

echo file_get_contents(‘phar://test.phar/hello_world.txt’);

Создание и использование библиотек Phar

В этом разделе, мы научимся создавать собственные phar библиотеки и использовать их в нужных целях. Для начала напишем 2 класса, которые нам пригодятся:

classes/SampleClass.php

<?
class SampleClass {
    var $sName;
    var $sVersion;
    // constructor
    function SampleClass() {
        $this->sName = ‘I am Sample class’;
        $this->sVersion = ’1.0.0′;
    }
    function getAnyContent() {
        return <h1>Hello World from Sample class</h1>’;
    }
    function getContent2() {
        return <h2>Get content 2</h2>’;
    }
}
?>

classes/SampleClass2.php

<?
class SampleClass2 extends SampleClass {
    // constructor
    function SampleClass2() {
        $this->sName = ‘I am Sample class 2′;
        $this->sVersion = ’1.0.2′;
    }
    function getAnyContent() {
        return <h1>Hello World from Sample class 2</h1>’;
    }
}
?>

Очень просто, неправда ли? Теперь создадим в этой же папке файл, который будет подключать оба класса.

classes/index.php

<?
require_once(‘SampleClass.php’);
require_once(‘SampleClass2.php’);
?>

Теперь создайте папку lib, которая будет использоваться для phar библиотек. И создадим главный PHP файл, который будет компилировать phar архивы, и будет демонстрировать работоспособность библиотек.

index.php

<?
$sLibraryPath = ‘lib/SampleLibrary.phar’;
// we will build library in case if it not exist
if (! file_exists($sLibraryPath)) {
    ini_set(«phar.readonly», 0); // Could be done in php.ini
    $oPhar = new Phar($sLibraryPath); // creating new Phar
    $oPhar->setDefaultStub(‘index.php’‘classes/index.php’); // pointing main file which require all classes
    $oPhar->buildFromDirectory(‘classes/’); // creating our library using whole directory
    $oPhar->compress(Phar::GZ); // plus - compressing it into gzip
}
// when library already compiled - we will using it
require_once(‘phar://’.$sLibraryPath.‘.gz’);
// demonstration of work
$oClass1 = new SampleClass();
echo $oClass1->getAnyContent();
echo <pre>;
print_r($oClass1);
echo </pre>;
$oClass2 = new SampleClass2();
echo $oClass2->getAnyContent();
echo $oClass2->getContent2();
echo <pre>;
print_r($oClass2);
echo </pre>;
?>

Результат выполнения нашего скрипта предоставлен на скриншоте ниже:

Пример работы Phar

В начале, проверяем, существует ли наша библиотека (lib/SampleLibrary.phar). Если существует – нам не нужно компилировать ее снова. Если нет – мы автоматически компилируем и пакуем нашу библиотеку.

Для начала проверяем читаемость phar архива с помощью функции ini_set. Далее, указываем имя и будущее местонахождение архива, для phar конструктора. С помощью setDefaultStub, указываем главный файл в библиотеке, который будет подключать все классы библиотеки. С помощью функции buildFromDirectory, собственно произошло компилирование библиотеки. Функция compress сжала библиотеку в формат GZIP.

Обращение к библиотеке происходит с помощью phar://. Это синтаксис PHP stream wrapper.

Добавление файлов в библиотеку Phar

Добавить файл в библиотеку, можно с помощью разных функций:

Phar::addFile()

Phar::addFromString()

Phar::addEmptyDir()

Phar::buildFromDirectory()

Phar::buildFromIterator()

Смотрите несколько примеров добавления файлов в архив:

$phar = new Phar(‘sitear.phar’);
$phar[‘index.php’] = file_get_contents(‘some/path/to/file.php’); // черезсвойствообъектаввидедоступакэлементаммассива (ArrayAccess)
$phar = new Phar(‘sitear.phar’);
$phar->addFile(‘http://sitear.ru’, ‘somefile.html’);
$phar->addFromString(‘somepage, file_get_contents(‘http://sitear.ru’));
$phar = new Phar(‘sitear.phar’);
$phar->addEmptyDir(‘temporary/’);
$phar->buildFromDirectory(‘some_directory/’);
$phar = new Phar(‘sitear);
$dir = ‘somedir/’;
$phar->buildFromIterator(
    new RecursiveDirectoryIterator($dir)
);

Чтение phar архива

Как в случае с добавлением файлов, чтение phar архива, можно провести несколькими способами:

PHP stream wrapper (phar://)

прямое подключение

Phar::extractTo()

Итерация по инстансу ‘Phar’

Сжатие Phar архива

Сжатие phar архивов, можно провести с использованием двух функций compress() и compressFiles(). Функция compress(), принимает два параметра, это имя файла и тип сжатия. Функция compressFiles(), принимает только один параметр – тип сжатия.

Рассмотрим пример использования функции compress():

$phar=new Phar(‘sitear.phar’);
$phar->buildFromDirectory(‘ sitear /’);
if (Phar::canCompress(Phar::GZ))
{
   $phar->compress(Phar::GZ,‘.phar.gz’);
}
else if (Phar::canCompress(Phar::BZ2))
{
   $phar->compress(Phar::BZ2,‘.phar.bz2′);
}

Также рассмотрим пример сжатия phar архива с помощью compressFiles():

$phar=new Phar(‘sitear.phar’);
$phar->buildFromDirectory(‘sitear/’);
if (Phar::canCompress(Phar::GZ))
{
   $phar->compressFiles(Phar::GZ);
}
else if (Phar::canCompress(Phar::BZ2))
{
   $phar->compressFiles(Phar::BZ2);
}

Конвертация форматов архива

Мы уже рассматривали сжатие phar архивов, в разделе выше. В данном разделе рассмотрим конвертацию форматов архива. Конвертацию архива, можно сделать несколькими способами:

Phar::ConvertToData()

Принимает три параметра:

Формат — Phar::TAR, Phar::ZIP

Сжатие — Phar::NONE, Phar::GZ, Phar::BZ2

Расширение — .tar, .tar.bz2, .tar.gz, .zip

Другой вариант, используя функцию Phar::ConvertToExecutable(), которая принимает все тоже, что и предыдущая, за исключением последнего параметра (расширения).

Сигнатура (защита) phar архивов

Сигнатура phar библиотек, используется для защиты архивов. А если говорить точнее, для проверки достоверности данных. PHAR поддерживает несколько алгоритмов создания сигнатур:

MD5

SHA1

SHA256

SHA512

При установки сигнатуры phar архива, используют метод Phar::setSignatureAlgorithm(), который принимает два параметра: тип сигнатуры, приватный ключ. Причем, типы сигнатуры в функции, указываются следующим образом:

Phar::MD5

Phar::SHA1

Phar::SHA256

Phar::SHA512

Phar::OPENSSL

Для большей ясности смотрите примеры установки сигнатуры на phar архив:

$phar=new Phar(‘sitear.phar’);
$phar->buildFromDirectory(‘ sitear /’);
$signatures=Phar::getSupportedSignatures();
if (in_array(PHAR::SHA512,$signatures))
{
   $phar->setSignatureAlgorithm(PHAR::SHA512);
}
elseif (in_array(PHAR::SHA256,$signatures))
{
   $phar->setSignatureAlgorithm(PHAR::SHA256);
}
elseif (in_array(PHAR::SHA1,$signatures))
{
   $phar->setSignatureAlgorithm(PHAR::SHA1);
}
elseif (in_array(PHAR::MD5,$signatures))
{
   $phar->setSignatureAlgorithm(PHAR::MD5);
}

и для OpenSSL:

$phar=new Phar(‘sitear.phar’);
$phar->buildFromDirectory(‘sitear/’);
$OSSLPrivateKey=openssl_get_privatekey(file_get_contents(private.pem’));
$OSSLPKey=»;
openssl_pkey_export($OSSLPrivateKey,$OSSLPKey);
$phar->setSignatureAlgorithm(Phar::OPENSSL,$OSSLPKey);

Чтение других архивов

Также phar поддерживает чтение других архивов: ZIP и TAR. Архивы читаются, так как и phar архивы. При этом, длинна названия архива не должна превышать 255 байт, включая путь файла, и то, что в своем названии он должен иметь слово .phar. Например: sitear.phar.gz.

Источник:  sitear.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи