Использование Phar-архивов: Введение
Концептуально Phar-архивы аналогичны JAR-архивам Java, но учитывают
нужды и гибкость PHP-приложений. Phar-архив используется для распространения
законченного PHP-приложения или библиотеки в виде одного файла. Приложение,
имеющее вид Phar-архива, используется в точности так же, как и любое другое PHP-приложение:
Использование библиотеки, имеющей вид Phar-архива, идентично использованию любой другой PHP-библиотеки:
Обёртка потока phar
представляет собой основу модуля phar,
про её использование подробно написано здесь.
Обёртка потока phar
предоставляет доступ к файлам внутри phar-архива
с использованием стандартных файловых функции PHP: fopen(), opendir()
и других, которые работают с обычными файлами.
Обёртка потока phar
поддерживает все операции чтения/записи
как над файлами, так и над каталогами.
Класс Phar реализует расширенные возможности по доступу к файлам
и по созданию phar-архивов. Использование класса Phar подробно описано здесь.
Кроме того, проверка содержимого phar-файла может быть осуществлена с помощью любого
из поддерживаемых симметричных алгоритмов хеширования (MD5, SHA1, SHA256 и SHA512, если ext/hash включён),
а также с помощью подписывания асимметричными открытым/закрытым ключами, используя OpenSSL.
Для того чтобы использовать подписывание OpenSSL, вам необходимо сгенерировать пару из открытого и закрытого ключей
и установить закрытый ключ для подписывания, используя Phar::setSignatureAlgorithm().
Кроме того, открытый ключ, извлечённый при помощи этого кода:
<?php
$public = openssl_get_publickey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($public, $pkey);
?>
должен быть сохранён рядом с phar-архивом, для проверки которого он используется.
Если phar-архив сохранён как
/путь/к/моему/архиву/my.phar
,
то открытый ключ должен быть сохранён как
/путь/к/моему/архиву/my.phar.pubkey
,
иначе phar не сможет проверить подлинность подписи OpenSSL.
Класс Phar также предоставляет 3 статических метода:
Phar::webPhar(), Phar::mungServer() и Phar::interceptFileFuncs(),
которые имеют решающее значение для упаковки PHP-приложений, предназначенных для использования на обычных файловых системах
и для веб-приложений. Phar::webPhar() реализует фронтальный контроллер,
который направляет HTTP-вызовы в правильное место внутри phar-архива.
Phar::mungServer() используется для изменения значений массива $_SERVER,
что позволяет обмануть приложения, обрабатывающие эти значения.
Phar::interceptFileFuncs() инструктирует Phar о необходимости перехвата вызовов
fopen(), file_get_contents(), opendir() и прочих функций,
основанных на stat (file_exists(), is_readable() и так далее)
и перенаправления всех относительных путей внутрь phar-архива.
Например, для упаковки выпуска популярного приложения phpMyAdmin
для его использования в качестве phar-архива, требуется только этот простой скрипт,
а phpMyAdmin.phar.tar.php
будет доступен как обычный файл
на вашем веб-сервере после изменения значений user/password: