← Назад к вопросам

Как расшифровывается PHAR?

1.0 Junior🔥 41 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое PHAR?

PHAR расшифровывается как PHP Archive (Архив PHP). По аналогии с JAR (Java Archive) для Java, это формат архива, предназначенный специально для упаковки и распространения PHP-приложений или библиотек в виде единого файла. По сути, это мощный инструмент для создания самодостаточных исполняемых пакетов из PHP-кода, его зависимостей и ресурсов (изображений, конфигурационных файлов, шаблонов и т.д.).

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

Ключевые аспекты PHAR

1. Структура и аналогии

PHAR-файл — это не просто обычный ZIP или TAR архив. Это «умный» архив, который:

  • Содержит манифест (stub) — специальный PHP-скрипт, который выполняется первым при запуске PHAR-файла. Он может содержать «загрузчик» (loader), который регистрирует PHAR в потоковой обертке phar://, или напрямую вызывать основную логику приложения.
  • Может использовать сжатие (gzip или bzip2) для уменьшения размера.
  • Поддерживает цифровую подпись для верификации целостности и происхождения кода.
  • Внутренне может быть организован в форматах: собственный PHAR, ZIP или TAR.

2. Основные преимущества (Use Cases)

  • Упрощение дистрибуции: Вместо сотен файлов вы распространяете один. Примеры: инструменты для разработки вроде PHPUnit, Composer, PHPStan или приложения вроде системы управления серверами.
  • Изоляция зависимостей: Можно упаковать все сторонние библиотеки (vendors) внутрь архива, минимизируя конфликты версий на целевом сервере.
  • Упрощение деплоя: Загрузить и запустить один файл проще, чем синхронизировать целую структуру каталогов.
  • Создание консольных утилит: PHAR-файл можно сделать исполняемым, превратив его в удобную CLI-команду.
    chmod +x myapp.phar
    ./myapp.phar --help
    
  • Повышение производительности при чтении множества мелких файлов: За счет использования единого файла и кэширования в памяти (при использовании phar.readonly=0) можно получить выигрыш в скорости загрузки.

3. Пример создания простого PHAR-архива

Допустим, у нас есть простое приложение:

Структура:

/myapp
├── index.php
└── src/
    └── Greeter.php

src/Greeter.php:

<?php
namespace MyApp;

class Greeter {
    public static function hello($name) {
        return "Hello, $name, from PHAR!\n";
    }
}

index.php (это будет наш манифест - stub):

<?php
// Важно: Обязательный шебанг для CLI
#!/usr/bin/env php
<?php
// Сам stub начинается здесь
Phar::mapPhar('myapp.phar');
require_once 'phar://myapp.phar/src/Greeter.php';

use MyApp\Greeter;

echo Greeter::hello($argv[1] ?? 'World');
__HALT_COMPILER();

Создающий скрипт create-phar.php:

<?php
// Убедитесь, что директория для вывода существует
$pharFile = 'build/myapp.phar';

// Удаляем старый файл, если есть
if (file_exists($pharFile)) {
    unlink($pharFile);
}

// Создаем объект Phar
$phar = new Phar($pharFile);

// Начинаем буферизацию для создания stub
ob_start();
echo file_get_contents('index.php'); // Используем наш файл как основу для stub
$stub = ob_get_clean();

// Устанавливаем stub
$phar->setStub($stub);

// Добавляем файлы в архив
$phar->buildFromDirectory(__DIR__ . '/myapp');

// Применяем сжатие (опционально)
$phar->compressFiles(Phar::GZ);

echo "PHAR-архив успешно создан: $pharFile\n";

4. Важные ограничения и особенности безопасности

  • Режим только для чтения: По умолчанию в производственных средах (php.ini) директива phar.readonly установлена в On. Это критически важная настройка безопасности, предотвращающая случайную или злонамеренную модификацию PHAR-файлов на сервере. Для создания PHAR этот параметр необходимо временно отключить.
  • Подпись: PHAR поддерживает подписи SHA1, SHA256, SHA512 и OpenSSL. Всегда проверяйте подпись при загрузке архива из ненадежных источников.
  • Производительность: Хотя чтение из одного файла может быть быстрее, извлечение данных со сжатием требует дополнительных CPU-ресурсов.
  • Отладка: Отладка кода внутри PHAR может быть менее удобной, так как пути к файлам будут выглядеть как phar:///path/to/app.phar/src/Class.php.

Итог

PHAR (PHP Archive) — это стандартизированный, мощный формат упаковки PHP-приложений, который превращает множество файлов в единый, удобный для распространения и выполнения артефакт. Он широко используется в экосистеме PHP для дистрибуции инструментов командной строки, изоляции зависимостей и упрощения процессов развертывания. Однако его использование требует понимания модели безопасности (режим readonly) и особенностей работы с виртуальной файловой системой phar://.

Как расшифровывается PHAR? | PrepBro