- → Программирование
- → PHP
- → Статьи
Phar в PHP: преимущества и работа с PHAR
Сегодня мы познакомимся с понятием phar архивов, и их использовании в PHP. Зачем они нужны? Если вы пишите PHP приложение, которое направлено на развитие, то вы обязательно столкнетесь с такой проблемой. У вас будут происходить накопления PHP файлов, которые некуда будет девать. Предположим, тысяча или несколько тысяч файлов, которые занимают место. К тому же такое количество файлов, очень сложно загружать на хостинг, по FTP. Выходом из данной ситуации, будет использование phar архивов.
Сегодня мы узнаем
Создание, добавление файлов, чтение, сжатие и конвертация архивов
Сигнатура или защита 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>'; ?>
Результат выполнения нашего скрипта предоставлен на скриншоте ниже:
В начале, проверяем, существует ли наша библиотека (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
Development — Taras Moroz