Статьи

Упаковка ваших приложений с Phar

Развертывание веб-приложений может быть трудным и громоздким, если у вас нет нужных инструментов. Если вы когда-либо ранее развертывали приложение Java, я уверен, что вы слышали о файлах JAR (что означает «Java ARchive»). Все исполняемые / доступные файлы, составляющие приложение, могут быть объединены в один файл JAR, что является благом, когда приходит время развертывания.

PHAR («Php ARchive») аналогичен концепции файлов JAR, но для PHP. Если у вас PHP 5.3 или выше, расширение Phar встроено и включено; Вы можете начать использовать его без каких-либо дополнительных требований.

Эта статья призвана пролить свет на эту важную функцию для тех, кто ее не использовал ранее. Надеюсь, вы найдете это очень полезным инструментом и получите лучший и быстрый опыт развертывания.

Файлы PHAR по умолчанию считаются доступными только для чтения, и вы можете использовать любой файл PHAR без какой-либо специальной настройки. Это отлично подходит для развертывания. Но так как вы будете создавать свои собственные файлы PHAR, вам нужно разрешить доступ для записи, который осуществляется через файл php.ini .

Откройте php.ini , найдите директиву phar.readonly и измените ее соответствующим образом:

  phar.readonly = 0 

Теперь вы готовы упаковать свои библиотеки и приложения как PHAR.

Ваш первый ФАР

Начните с создания структуры каталогов приложения; где-нибудь в вашей системе создайте следующее:

application directory structure

Каталог build будет содержать пакет PHAR при его создании, чтобы избежать загрязнения исходного дерева созданными артефактами. В каталоге src содержатся исходные файлы, из которых состоит приложение.

index.php будет служить точкой входа в приложение, common.php будет псевдо-библиотекой общих классов, используемых приложением, а config.ini будет файлом конфигурации для приложения.

Содержимое index.php выглядит так:

 <?php require_once "phar://myapp.phar/common.php"; $config = parse_ini_file("config.ini"); AppManager::run($config); 

Содержимое common.php выглядит так:

 <?php class AppManager { public static function run($config) { echo "Application is now running with the following configuration... "; var_dump($config); } } 

И содержимое config.ini выглядит так:

  [база данных]
 хост = локальный
 дБ = имя_бд
 Пользователь = MyUser
 передать = DBPass 

Создание ФАР

Помимо структуры приложения, вам также необходим скрипт для создания архива PHAR. Создайте новый файл PHP с именем create-phar.php в корне myapp со следующим кодом:

 <?php $srcRoot = "~/myapp/src"; $buildRoot = "~/myapp/build"; $phar = new Phar($buildRoot . "/myapp.phar", FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, "myapp.phar"); $phar["index.php"] = file_get_contents($srcRoot . "/index.php"); $phar["common.php"] = file_get_contents($srcRoot . "/common.php"); $phar->setStub($phar->createDefaultStub("index.php")); copy($srcRoot . "/config.ini", $buildRoot . "/config.ini"); 

Затем откройте окно терминала, перейдите в каталог myapp и запустите его:

  aabouzekry @ platinum: ~ / myapp $ php create-phar.php 

После запуска сценария вы должны найти архив myapp.phar в каталоге build вместе с копией файла config.ini . Скопируйте эти два файла в корневой каталог документов вашего веб-сервера (например, htdocs ).

Чтобы получить доступ к упакованному приложению Phar, вы можете вызвать архив напрямую, но это не рекомендуется и может потребовать дополнительной настройки вашего веб-сервера для пересылки файлов PHAR в правильный обработчик PHP. Другой подход заключается в создании сценария запуска, который включает в себя архив.

Создайте скрипт запуска с именем run.php в run.php каталоге документов вашего веб-сервера с помощью следующего:

 <?php require "myapp.phar"; 

Код не делает ничего, кроме как обойти настройку сервера для непосредственной обработки файлов PHAR. Если вы размещаете свое приложение в среде общего хостинга и не имеете доступа к конфигурации вашего сервера, то это также идеальное решение!

После создания раннера ваш веб-корень должен выглядеть так:

files in document root

Направьте ваш браузер на скрипт run.php и вы должны увидеть следующий вывод:

browser output

За занавесками

Давайте подробнее рассмотрим код create-phar.php чтобы понять, что все это значит. Посмотрите на следующую строку:

 <?php $phar = new Phar($buildRoot . "/myapp.phar", FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, "myapp.phar"); 

Создается новый объект Phar который обычно принимает три аргумента. Первым аргументом является путь к архивному файлу для манипулирования. Вы можете не только создавать новые архивы, но и манипулировать существующими.

Второй аргумент — это флаг, который устанавливает, как объект будет обрабатывать файлы. Объект Phar RecursiveDirectoryIterator класс PHP RecursiveDirectoryIterator и этот аргумент просто передается родительскому классу. Аргумент, который я предоставил, является по умолчанию для RecursiveDirectoryIterator любом случае, это нормально.

Третий аргумент — псевдоним для архива, который будет использоваться внутри при обращении к самому себе с помощью оболочки потока phar. Другими словами, все файлы в архиве, которые требуют включения других файлов из архива, должны ссылаться на него явно, используя потоковую оболочку и псевдоним. Например, код из index.php ранее ссылается на файл common.php таким образом.

 <?php require_once "phar://myapp.phar/common.php"; 

После создания объекта в архив добавляются index.php и common.php . Код теперь обрабатывает объект Phar как ассоциативный массив, чтобы указать содержимое файлов с ключевыми именами их файлов, а file_get_contents() используется для чтения файла с диска. Вы можете добавить столько файлов, сколько хотите, аналогично, но если вам нужно добавить много файлов или весь каталог, то вы можете рассмотреть возможность использования более удобного buildFromDirectory() .

 <?php $phar->buildFromDirectory("/path/to/dir",'/.php$/'); 

Первый аргумент для buildFromDirectory() — это путь к нужному каталогу, а второй — необязательное регулярное выражение, указывающее, какие файлы включать. Чтобы включить все файлы в каталог, просто пропустите второй аргумент.

Метод setStub() вызывается для создания файла-заглушки. Заглушка сообщает архиву, что делать, когда он загружен компилятором.

Наконец, config.ini копируется из каталога src каталог build вместе с архивом.

Заглушка

Когда вы запускаете архив PHAR, заглушка внутри обрабатывается как метафайл, чтобы инициализировать архив и сообщить ему, что делать при его вызове, не обращаясь к конкретному файлу. В этом примере я оставил создание файла-заглушки до объекта Phar с помощью createDefaultStub() который создал заглушку по умолчанию, содержащую следующий код:

 <?php Phar::mapPhar(); include "phar://myapp.phar/index.php"; __HALT_COMPILER(); 

Заглушка по умолчанию, созданная с помощью createDefaultStub() иллюстрирует чуть больше минимальных требований. Phar::mapPhar() заполняет метаданные архива и инициализирует его, и ваш стаб-файл должен заканчиваться вызовом __HALT_COMPILER() без завершающего пробела. Эта функция останавливает дальнейшее выполнение интерпретатором PHP на этом этапе, предоставляя возможность включения данных после него без риска их выполнения. Это требование оболочки Phar, без которой архив вообще не будет работать.

Кроме того, вы можете создать свой собственный файл-заглушку для выполнения пользовательских инициализаций вашего архива PHAR и прочитать его примерно так:

 <?php $phar->setStub(file_get_contents("stub.php")); 

Принимая Фар серьезно

Если вы разрабатываете библиотеку классов или другой включаемый код, размещение его в архиве PHAR — это аккуратное и аккуратное решение для его распространения в нескольких проектах. Расширение Phar было высоко оптимизировано, чтобы обеспечить такую ​​же производительность, если не лучше, чем обычный доступ к файлам, поэтому, скорее всего, вы не будете снижать производительность своего собственного приложения, используя его.

Для эффективного использования Phar, хотя вы должны знать, что у него есть некоторые ограничения. Вот несколько советов, которые помогут вам лучше понять Phar и получить максимальную отдачу от него:

  • Вы можете упаковать целое приложение в PHAR, но это не решение для автоматического развертывания. Это метод доступа к файлу для приложения.
  • Вы можете выполнить функцию автоматического развертывания вручную внутри архива, что позволяет создавать более надежные варианты развертывания, такие как создание кеша и загрузка каталогов на сервер, генерация общих файлов конфигурации и т. Д.
  • Вы должны избегать обратной переписки с Phars в реальном развертывании Вместо этого поместите все доступные для записи файлы за пределы архива. Запись в PHAR отключена в стандартной установке PHP, потому что для вашего приложения это небезопасно.

Резюме

Phar может избавить вас от хлопот в упаковке и развертывании ваших приложений, и я рекомендую вам рассмотреть возможность его использования. Эта статья была призвана познакомить вас с основными понятиями Phar. Вы увидели, как создать архив и включить файлы, немного узнали о важности заглушки и о том, как PHP может обращаться к файлам в архиве. К сожалению, ресурсы для работы с Phar в руководстве по PHP неполны, а ограниченное количество ресурсов в других местах в Интернете недостаточно полезно. Надеюсь, в следующих статьях я смогу показать вам больше об использовании Phar.

Изображение через Павла Игнатова / Shutterstock