Разные версии PHP для разных сайтов на локальной машине
Старое ядро Битрикса требует PHP 7.4, новый портал — 8.2. Как развести версии по сайтам через пулы PHP-FPM, что для этого нужно на macOS и Linux и что ломается после переключения.
Кирилл Новожилов
автор Omut, BXMax
Ситуация знакомая почти всем, кто ведёт больше одного проекта на Битриксе: старый интернет-магазин на ядре пятилетней давности не заводится ничего выше PHP 7.4, свежий портал требует 8.2, а промо-сайт живёт где-то посередине. Локальный сервер при этом обычно умеет ровно одну версию PHP «на всё».
Разберём, как разложить версии по сайтам и что при этом ломается.
Почему глобальное переключение не годится
В OSPanel, MAMP и большинстве панелей версия PHP выбирается для всего сервера.
Схема работает ровно до второго проекта: переключились на 7.4 ради старого
магазина — перестал открываться портал, вернули 8.2 — магазин отвечает
Parse error на первой же типизации свойств.
Ежедневное переключение туда-обратно — это ещё и перезапуск сервера, сброс opcache и потерянные сессии в админках.
Как это устроено под капотом
Технически задача решается одним способом, независимо от инструмента: поднимается несколько пулов PHP-FPM, каждый на своём сокете, а nginx направляет запрос в нужный по имени сайта.
/etc/php/7.4/fpm/pool.d/legacy.conf → /run/php/php7.4-legacy.sock
/etc/php/8.2/fpm/pool.d/portal.conf → /run/php/php8.2-portal.sock
В конфиге сайта:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-legacy.sock;
include fastcgi_params;
}
Всё остальное — вопрос того, кто пишет эти конфиги: вы или программа.
Вручную на macOS
brew tap shivammathur/php
brew install shivammathur/php/php@7.4
brew install php@8.2
brew services start php@7.4
brew services start php@8.2
Дальше нужно развести пулы по сокетам, прописать fastcgi_pass в каждом
серверном блоке nginx и следить, чтобы brew upgrade не переключил симлинки.
Отдельная радость — PHP 7.4 на Apple Silicon: официальных сборок под ARM нет,
формула ставится через Rosetta 2 либо собирается из исходников.
Вручную на Linux
Чуть проще: в Debian и Ubuntu репозиторий Ondřej Surý отдаёт версии от 5.6 до 8.4, и они спокойно живут рядом.
sudo add-apt-repository ppa:ondrej/php
sudo apt install php7.4-fpm php8.2-fpm php8.2-mysql php7.4-mysql
Пулы и сокеты всё равно настраиваются руками, зато обновления не ломают установку.
В Omut
Версия PHP выбирается на вкладке Настройки страницы сайта: 7.4 и 8.1–8.5. Сайт переходит в пул нужной версии, остальные сайты при этом продолжают работать. Рядом выбирается и версия MySQL.

Оговорка про редакции, чтобы не было сюрприза: разные версии на разных сайтах — это Pro. В бесплатной версии доступна одна версия PHP по умолчанию, общая для новых сайтов; уже выбранные версии у существующих сайтов сохраняются, но сменить их нельзя. Подробности — в Настройках и на странице Free и Pro.
PHP 7.4 на Apple Silicon работает через Rosetta 2: сборок 7.4 под ARM нет. Если Rosetta на маке не установлена, Omut предложит поставить её сам. Помните, что это трансляция, а не нативный код.

Что ломается при смене версии
Переключить версию мало — Битрикс это заметит.
Расширения. Каждая версия PHP имеет свой набор скомпилированных модулей.
После переключения проверьте mbstring, mysqli, gd, zip, opcache,
а для Битрикс24 — sockets и pcntl. Быстрая проверка: php -m в терминале
сайта или bitrix_server_test.php из дистрибутива.
Кэш Битрикса. Скомпилированные шаблоны и managed cache остаются от прошлой версии и дают странные ошибки. После смены — очистите кэш через админку или инструменты окружения.
opcache. Держит скомпилированный байт-код прошлой версии до перезапуска пула. Если после переключения страница отдаёт старый код — дело почти всегда в нём.
Свой php.ini на версию. Лимиты не переезжают автоматически: подняли
memory_limit на 8.2 — на 7.4 он остался прежним. Для админки Битрикса
критичны memory_limit от 256M и max_input_vars от 10000. В Omut у каждой
версии свой php.ini, он открывается из «Окружение» → «Где что лежит», и ваши
правки в нём переживают перезапуск и обновления.
Старые ядра и 8.x. Битрикс до 20.х массово ловит Deprecated на PHP 8:
неявные приведения типов, strlen(null), динамические свойства. Формально сайт
работает, но лог заполняется, а E_DEPRECATED в выводе ломает вёрстку и AJAX.
Либо обновляйте ядро, либо оставляйте такой проект на 7.4.
Как проверить, что версия применилась
Не полагайтесь на надпись в интерфейсе — проверьте со стороны сайта:
- Положите в корень файл с
<?php phpinfo();и откройте его в браузере — он покажет версию именно того пула, который обслуживает этот домен. - Или выполните
php -vв терминале сайта, если инструмент даёт терминал в контексте проекта. - Удалите файл
phpinfoпосле проверки — даже на локальной машине.
Разница важна: php -v в системном шелле показывает версию CLI, а сайт
обслуживает PHP-FPM, и это могут быть разные версии.

