Правильная конфигурация платформы в Composer

Раздел: Инструменты PHP -> Управление зависимостями

Платформа Composer: конфигурация platform

Как заставить Composer считать, что проект работает на определенной версии PHP, даже если реальная версия отличается?

Основной способ управления ожидаемой платформой в Composer - это секция config.platform в файле composer.json. Эта настройка позволяет указать версию PHP и список доступных расширений, которые Composer будет использовать при разрешении зависимостей, игнорируя фактическую конфигурацию окружения, где выполняется команда.

Цель: гарантировать, что устанавливаемые пакеты совместимы с целевым сервером, даже если локальная версия PHP отличается. Например, разработка ведется на PHP 8.2, а продакшн работает на PHP 7.4.

Пример базовой конфигурации в composer.json:

{
    "config": {
        "platform": {
            "php": "7.4.33",
            "ext-json": "*",
            "ext-pdo": "*"
        }
    }
}

удалить php (удаление php)

После добавления такой секции команды composer install или composer update будут использовать указанную версию PHP (7.4.33) для проверки зависимостей. Расширения ext-json и ext-pdo помечаются как доступные, даже если в реальной системе они не установлены.

Типичные проблемы и ошибки:

  • Установка пакетов, которые требуют PHP 8.0, при указанном platform php 7.4 приведет к ошибке зависимости. Решение - проверять фактическую платформу при деплое с помощью composer check-platform-reqs.
  • Если указать неправильную версию PHP (например, 8.2.0, а на сервере 7.4), Composer установит пакеты, которые при запуске вызовут фатальные ошибки. Рекомендуется всегда тестировать на реальном окружении.
  • Секция platform переопределяет только проверку зависимостей, но не изменяет фактическое окружение. После установки пакета, который требует определенного расширения, необходимо убедиться, что расширение действительно доступно.

Как временно переопределить платформу для одной команды установки?

Если изменение composer.json нежелательно, можно передать параметр --platform напрямую команде composer install или composer update.

Цель: одноразовая установка или обновление с учетом другой платформы, например, при развертывании в контейнере с отличной версией PHP.

composer install --platform=php:8.1.10 --platform=ext-json:*

Docker php composer (composer в docker php)

В этом примере Composer считает, что доступна PHP 8.1.10 и расширение json. Результат аналогичен добавлению секции platform в composer.json, но временный.

Особенности:

  • Параметр можно повторять для указания нескольких расширений и версий.
  • Настройка действует только для текущего вызова; последующие команды без параметра используют реальную платформу.
  • Если в composer.json уже задана секция platform, параметр командной строки имеет приоритет и переопределяет её.

Как настроить platform для всех проектов на локальной машине глобально?

Для глобального применения можно использовать переменные окружения или глобальный конфигурационный файл Composer.

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

Способ 1 - переменная окружения COMPOSER_PLATFORM_REQUIREMENTS:

export COMPOSER_PLATFORM_REQUIREMENTS="php:7.4.33 ext-json:* ext-pdo:*"

Composer platform php (платформа composer (platform config))

Способ 2 - глобальный файл ~/.composer/composer.json или $COMPOSER_HOME/config.json:

{
    "config": {
        "platform": {
            "php": "7.4.33"
        }
    }
}

Composer php (composer менеджер зависимостей php)

Тогда для любого проекта, не имеющего собственной секции platform, будет применяться глобальная настройка.

Важно:

  • Глобальная настройка не переопределяет локальную секцию platform в проекте; если в проекте есть своя конфигурация, она имеет приоритет.
  • Переменная окружения имеет наивысший приоритет и переопределяет и локальную, и глобальную конфигурацию.

Что делать, если нужно установить пакеты без проверки платформы?

Иногда требуется принудительно установить зависимости, игнорируя все требования к PHP и расширениям. Для этого используется флаг --ignore-platform-reqs.

Цель: экстренная установка, например, при восстановлении проекта на несовместимом окружении для временного анализа кода, или когда расширения будут доустановлены позже.

composer install --ignore-platform-reqs

Php composer json (php: работа с composer.json)

Эта команда пропускает проверку версии PHP, расширений и даже значений конфигурации (например, memory_limit).

Риски:

  • Установленные пакеты могут не работать в текущей среде, вызывая ошибки при запуске.
  • Для продакшена такой подход неприемлем; используйте его только в изолированных сценариях.
  • Composer может вернуть предупреждение, но выполнит установку.

Как указать в platform наличие определенных расширений, которые фактически не установлены?

Помимо версии PHP, в секции platform можно перечислить любые расширения, указав версию или звездочку (*) для любой версии.

Цель: имитировать окружение, где расширение присутствует (например, при разработке без установленного расширения на локальной машине, но с планами установить его на сервере).

{
    "config": {
        "platform": {
            "php": "8.1.0",
            "ext-swoole": "5.0.0",
            "ext-redis": "*"
        }
    }
}

Composer будет считать, что расширения swoole версии 5.0.0 и redis любой версии доступны.

Ошибки:

  • Если расширение не будет установлено на сервере, код, использующий его, упадет. Рекомендуется синхронизировать список platform с фактическим окружением.
  • Для встроенных в PHP расширений (например, ext-json) версия обычно не важна - используйте *.
- Composer php 8.1 (установка composer для php 8.1)

Расширенные примеры использования platform config

Пример 1: Точная настройка для продакшена с проверкой совместимости

Допустим, целевой сервер работает с PHP 8.1.6, установлены расширения mbstring и pdo. В localhost используется PHP 8.2.3. Чтобы избежать установки пакетов, требующих PHP 8.2, добавляем в composer.json:

Пример
{
    "config": {
        "platform": {
            "php": "8.1.6",
            "ext-mbstring": "*",
            "ext-pdo": "*"
        }
    }
}

Выполним установку:

Пример
composer install

Чтобы проверить, какую платформу использует Composer, выполним:

Пример
composer show -p

Результат (фрагмент):

platform packages:
  composer/semver                             3.3.2
  php                                         8.1.6 (настроено)
  ext-mbstring                                * (настроено)
  ext-pdo                                     * (настроено)

Видно, что Composer показывает настроенные версии, а не реальные.

Пример 2: Использование platform в CI (GitHub Actions)

В сценарии Continuous Integration часто требуется проверять совместимость с разными версиями PHP. Можно задать platform динамически через переменную окружения.

Пример файла .github/workflows/ci.yml:

Пример
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php: [7.4, 8.0, 8.1]
    steps:
      - uses: actions/checkout@v3
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
      - name: Install dependencies with platform constraint
        run: |
          composer install --no-interaction --platform=php:${{ matrix.php }}
      - name: Run tests
        run: vendor/bin/phpunit

Здесь каждая версия PHP запускает установку с соответствующим platform. Результат: Composer не будет устанавливать пакеты, несовместимые с указанной версией, даже если в composer.json есть platform для другой версии.

Пример 3: Разные platform для разработки и продакшна через файлы конфигурации

Создадим два файла конфигурации: composer.local.json для локальной разработки и composer.prod.json для развертывания.

Содержимое composer.local.json:

Пример
{
    "config": {
        "platform": {
            "php": "8.2.0",
            "ext-xdebug": "*"
        }
    }
}

Содержимое composer.prod.json:

Пример
{
    "config": {
        "platform": {
            "php": "8.1.6"
        }
    }
}

При установке на локальной машине используем:

Пример
composer install --no-dev --config=composer.local.json

Или просто переименовываем файл перед выполнением. Для авторизации продакшна можно передать путь к конфигу через переменную COMPOSER.

Пример 4: Имитация отсутствующего расширения для установки пакета

Предположим, пакет vendor/package-a требует ext-imagick, которого нет локально. Мы хотим установить пакет для статического анализа, но не планируем запускать код, использующий Imagick.

Добавляем в composer.json:

Пример
{
    "config": {
        "platform": {
            "ext-imagick": "*"
        }
    }
}

Затем:

Пример
composer update vendor/package-a --no-dev

После установки проверяем:

Пример
composer show -p

Результат:

platform packages:
  php                                         8.3.3 (реальная версия)
  ext-imagick                                 * (настроено)

Composer считает, что ext-imagick доступен, и установка прошла успешно. Важно помнить, что реальный запуск кода вызовет фатальную ошибку, если расширение не установлено.

Пример 5: Установка с игнорированием части платформы

Флаг --ignore-platform-req позволяет проигнорировать только одно конкретное требование.

Пример
composer install --ignore-platform-req=ext-swoole

Это пропустит проверку наличия ext-swoole, но остальные требования (php, ext-json и т.д.) останутся активными. Полезно, когда одно расширение будет доустановлено позже.

Пример 6: Использование platform в библиотеке (composer.json для пакета)

Если вы разработчик библиотеки, можете указать минимальную версию PHP в секции require, но platform не влияет на установку вашего пакета у потребителя. Однако в процессе тестирования вашей библиотеки можно настроить platform в корневом composer.json тестового проекта.

Пример
{
    "require": {
        "php": "^8.0"
    },
    "config": {
        "platform": {
            "php": "8.0.0"
        }
    }
}

При запуске composer update будут применяться ограничения, как будто используется PHP 8.0.0, что позволяет проверить обратную совместимость.

Платформа Composer (platform config) - comments

En
Composer platform php (php)