Войти Регистрация

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


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

Сегодня мы узнаем

Phar – что это такое?

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

Создание, добавление файлов, чтение, сжатие и конвертация архивов

Сигнатура или защита 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.

Заключение

Использование phar в программировании на PHP, очень удобно и полезно. Это экономит ваше дисковое пространство, защищает код, улучшает производительность и многое другое при создании больших PHP приложений.

Если у вас есть предложения или вопросы по использованию Phar в PHP, выскажите их в комментариях! 



Дальше: APC в PHP: Понятие, установка, использование APC


Дискуссия по теме     0 Комментариев
Добавить комментарий
Просмотров: 6020