- PVSM.RU - https://www.pvsm.ru -
Как уже, наверное, всем известно, в PHP 5.3 появилась поддержка специального типа архивов с расширением .phar. Те, кто не в курсе — могут почитать отличную статью .phar — исполняемые PHP-архивы [1]
Область применения, которая сразу приходит на ум — это библиотеки/фреймворки в виде подключаемых *.phar архивов и установщики веб-приложений, например, CMS. О последних я и собираюсь рассказать подробнее и с примерами.
Цель — получить на выходе один файл, который будет сам по себе исполняемым, и будет содержать в себе все нужные файлы. Если провести аналогию c обычными приложениями — это приложение, которое запаковано в SFX (self-extracting archive).
Примеры в статье написаны для PHP 5.4 (но их легко подправить под 5.3), а так же используется PEAR библиотека Archive_Tar для создания нативных *.tar архивов.
Возьмем для примера простейшую структуру:
build.php index.php install.php readme.txt
Естественно, файл install.php нужен только на этапе установки, а build.php только на этапе сборки. Файл readme.php будем создавать на этапе сборки.
Сначала мы соберем нужные файлы в tar, это дает возможность обойти некоторые ограничения *.phar формата, например, недопустимость кириллицы в названии файла. Если использовать для этого Phar или PharData — придется переименовывать файлы в допустимый вид при запаковке, и обратно в исходный вид при распаковке.
Создаем tar архив:
//Подключаем PEAR библиотеку
require_once 'Archive/Tar.php';
//Создаем файл
$tar = new Archive_Tar(__DIR__.'/system.phar.tar');
Расширение файла указано .phar.tar для того, чтобы php мог с ним работать.
Добавляем файлы в архив:
//Добавляем существующие файлы
$tar->createModify(
[
'index.php',
'install.php'
],
null,
__DIR__
);
//Третий параметр для того, чтобы получить внутри архива пути относительно текущей директории, а не корня файловой системы.
//Создаем readme.txt, в котором сохраним дату и время сборки проекта
$tar->addString(
'readme.txt',
"This is demo projectnBuilt ".date('d-m-Y').' at '.date('H:i')
);
Создадим из полученного архива так званый tar-based phar.
//Открываем существующий архив
$phar = new Phar(__DIR__.'/system.phar.tar');
//Конвертируем с bz2 сжатием, назначаем расширение .phar
$phar->convertToExecutable(Phar::TAR, Phar::BZ2, '.phar');
Для этого нужно задать файл, который будет открываться при попытке прямого доступа к файлу веб-сервером. По-умолчанию это index.php, но у нас установка, поэтому нужно открыть install.php
//Открываем конвертированный архив
$phar = new Phar(__DIR__.'/system.phar');
//Меняем открываемый по умолчанию файл
$phar->setStub("<?php Phar::webPhar(null, 'install.php'); __HALT_COMPILER();");
//Переименовываем
rename(__DIR__.'/system.phar', __DIR__.'/system.phar.php');
Странный формат .phar.php играет очень важную роль. Расширение .php заставляет передавать файл интерпретатору PHP, а .phar дает понять, что это архив, а не файл с исходным кодом. По-сути, архив превращается в директорию, например, можно ввести в адресной строке браузера /system.phar.php/index.php — и это будет работать.
Лиснинг install.php, который производит установку
//Определяем путь к корню, где лежит архив, находясь внутри него
$root = substr(pathinfo(__DIR__, PATHINFO_DIRNAME), 7);
//Открываем и распаковываем 2 файла из архива в корень
(new Phar($root.'/'.pathinfo(__DIR__, PATHINFO_BASENAME)))->extractTo(
$root,
[
'index.php',
'readme.txt'
]
);
//Удаляем архив (не обязательно)
unlink($root.'/'.pathinfo(__DIR__, PATHINFO_BASENAME));
И герой, ради которого затевалась вся кухня — index.php
echo 'I was inside the phar archive';
Надеюсь, кому-то эта информация будет полезна, и всё больше продуктов будет поставляться не в виде zip/rar/tar/gz/bz2 архивов, а нативного phar, для чего он и был создан.
Исходные файлы [2] system.phar.php [3]
Автор: nazarpc
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/12355
Ссылки в тексте:
[1] .phar — исполняемые PHP-архивы: http://habrahabr.ru/post/118269/
[2] Исходные файлы: https://dl.dropbox.com/u/62195352/phar.tar
[3] system.phar.php: https://dl.dropbox.com/u/62195352/system.phar.php
Нажмите здесь для печати.