Календарь на Апрель 2024 года: calendar2008.ru/2024/aprel/
Навигация
Главная »  Игры 

Самоисполняемый phar как способ распространения веб-приложений


Источник: habrahabr
nazarpc
Как уже, наверное, всем известно, в PHP 5.3 появилась поддержка специального типа архивов с расширением .phar. Те, кто не в курсе - могут почитать отличную статью .phar - исполняемые PHP-архивы
Область применения, которая сразу приходит на ум - это библиотеки/фреймворки в виде подключаемых *.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.txt будем создавать на этапе сборки.

Создание tar


Сначала мы соберем нужные файлы в 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 project\nBuilt ".date('d-m-Y').' at '.date('H:i') ); 

Превращаем tar в phar


Создадим из полученного архива так называемый 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("

Странный формат .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, для чего он и был создан. Исходные файлы system.phar.php



 

 Birdstep стремится в лидеры "беспроводных решений".
 Лицензирование ПО Microsoft.
 ИТ-аутсорсинг в малом бизнесе - за и против.
 Виртуальные функции. Что это такое? Часть 2 (исходники).
 Интеграция в ассортименте.


Главная »  Игры 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.