Сайт на Битрикс с обновлённым ядром и старыми доработками
NorthRelay – сайт оборудования и решений для мобильной связи и интернета. В проекте работают каталог, страницы услуг, информационные разделы и собственные обработчики. Основа сайта – «1С-Битрикс» и решение «Аспро: Приорити».
Задача состояла в переходе с PHP 8.2.20 на PHP 8.5.12 в пределах существующего сервера. Нужно было сохранить работу страниц, подключение к базе данных, сессии, обработку изображений и запуск фоновых заданий. Для возврата к прежней конфигурации требовалось заранее подготовить резервные копии и порядок отката.
| Компонент | Исходное состояние | Значение для проекта |
|---|---|---|
| Сервер | CentOS 7, x86_64 | Работа в пределах существующей операционной системы. |
| Окружение | BitrixEnv 7.5.5 | Серверные инструменты используют системные настройки и программы. |
| Веб-сервер | Nginx и Apache | Страницы обрабатывались модулем PHP внутри Apache. |
| PHP | 8.2.20 | Нужно проверить веб-запросы и запуск из командной строки отдельно. |
| База данных | MySQL-совместимый сервер 5.7.44 | Сохранить подключение; тестовую копию разместить в отдельной БД. |
| Приложение | Битрикс, Аспро и собственный код | Совместимость зависит от конкретных компонентов и доработок. |
Наличие обновлённого ядра CMS не означало, что весь проект готов к новой версии PHP. В шаблонах и вспомогательных библиотеках оставались конструкции, которые требовали отдельной проверки. Поэтому начали с инвентаризации окружения и кода.
Новую версию PHP подготовили рядом с действующей
PHP использовался несколькими независимыми процессами. Веб-запросы проходили через Apache, задания cron вызывали отдельный исполняемый файл, а инструменты BitrixEnv опирались на системное окружение. Замена системного PHP затронула бы все эти зависимости одновременно.
Мы выбрали параллельную установку. Для PHP 8.5.12 подготовили отдельный каталог, конфигурацию, библиотеки, службу PHP-FPM и журналы. Системный PHP 8.2.20 сохранили для существующих серверных инструментов. Это позволило собирать и проверять новое окружение до переключения рабочего сайта.
Nginx → Apache → PHP-FPM
После переключения Apache передаёт выполнение PHP отдельному процессу PHP-FPM 8.5.12.
Cron → PHP 8.5.12
В расписании явно задаются новая версия PHP и её конфигурация.
Системный PHP 8.2.20
Сохраняется отдельный интерпретатор для инструментов действующего окружения.
Резервные копии и отдельное тестовое окружение
Зафиксировали версии программ, состав расширений, настройки PHP, Nginx и Apache, состояние служб и доступное место на диске. Сохранили конфигурации, архив файлов сайта и дамп базы данных. Проверили читаемость архивов и контрольные суммы.
Затем подготовили копию сайта с отдельной тестовой базой и отдельной учётной записью. Проверили импорт данных и права, необходимые для создания структуры таблиц. Исправления совместимости сначала применяли к тестовой копии, сохраняя исходные файлы.
Для выполнения PHP использовали отдельную тестовую службу. Проверяли не только запуск интерпретатора, но и прохождение запроса через веб-сервер, подключение защитного пролога Битрикс и загрузку нужного файла настроек.
К каждой операции готовили проверяемые условия выполнения. Несовпадение ожидаемого состояния останавливало следующий шаг.
Порядок возврата подготовили заранее. Исходные конфигурации и файлы сохранили до переключения. Это давало возможность вернуть прежний PHP-обработчик, если контрольные проверки обнаружат проблему.
Совместимые библиотеки и нужные сайту расширения
На существующем сервере новая версия PHP потребовала подготовки зависимостей. Собрали необходимые библиотеки, настроили загрузку их из отдельного каталога и проверили, какие версии реально использует PHP. В состав работ вошли OpenSSL, zlib, libssh2, cURL, XML-библиотеки и графические зависимости.
Проверили возможности работы с MySQL, HTTPS-запросами, многобайтовыми строками, XML, ZIP-архивами и изображениями. Для сайта важна была поддержка JPEG, PNG и WebP, а также обработка изображений средствами GD.
Проверка документации libssh2
Тест страниц руководства падал из-за настроек кодировки. Установили недостающий инструмент форматирования и запустили проверку в локали UTF-8. Оба теста выбранного набора libssh2 завершились успешно.
Повторная сборка GD
После неудачных графических тестов изменили конфигурацию сборки на встроенную GD с нужными форматами. Проверили зависимости и повторили тесты GD, cURL и OpenSSL.
Ошибки разбирали по журналам конкретного этапа. Успешная компиляция сама по себе ещё не подтверждала, что нужные расширения работают с корректными библиотеками.
754 успешных теста GD, cURL и OpenSSL
После исправлений выполнили выбранный набор тестов модулей PHP. Все выполненные тесты прошли. Пропущенные проверки учтены отдельно и не включены в число успешных.
| Показатель | Результат |
|---|---|
| Всего в выбранном наборе | 888 |
| Выполнено успешно | 754 |
| Пропущено тестовой системой | 134 |
| Ошибки и предупреждения тестовой системы | 0 ошибок, 0 предупреждений |
754 – число проверок модулей PHP. Оно не относится к количеству страниц, заявок или платежей. Проверки приложения и рабочего переключения выполнялись следующим этапом.
Четыре точечных исправления в коде проекта
Проверка на PHP 8.5 выявила проблемы в старых компонентах и библиотеке шаблона. Для каждого изменения сохранили исходный файл, подготовили исправленную версию и проверили синтаксис перед включением в рабочее переключение.
| Участок кода | Найденная проблема | Исправление |
|---|---|---|
| Компонент производителей | Недопустимая запись в $GLOBALS[]. | Удалили лишнюю операцию. Именованный фильтр связанных товаров сохранили. |
| Платёжный обработчик | Тип параметра допускал null неявно. | Явно указали допустимость null в сигнатуре метода. |
| Шаблон комментариев | Параметры со значениями по умолчанию стояли перед обязательными. | Согласовали объявление функции с фактической передачей аргументов. |
| LESS-компилятор Аспро | В конструкции case использовалась устаревшая форма с точкой с запятой. | Заменили разделитель на двоеточие. |
Проверка новой среды также обнаруживает старые дефекты, которые проявлялись лишь на отдельных маршрутах. Например, ограничение записи в $GLOBALS существовало до PHP 8.5. Поэтому причины ошибок отделяли от самого факта обновления.
Такой же подход к поиску причины использовали в кейсе расследования ошибки 503 на WordPress. В обоих проектах изменения опирались на наблюдаемую ошибку и проверку результата.
Проверили PHP через веб-сервер и повторили запросы к сайту
Перед переключением записали ответы контрольных страниц на PHP 8.2.20. Затем подключили Apache к новой службе PHP-FPM и проверили фактическую среду выполнения веб-запроса. Это было важно, потому что версия PHP в терминале может отличаться от версии, которая обслуживает сайт.
Рабочий запрос подтвердил PHP 8.5.12 и режим FPM/FastCGI. Отдельно проверили подключение к базе данных, совместимость сессии, защитный пролог и используемую конфигурацию. После этого повторили контрольный обход сайта.
| Проверка | Полученный результат |
|---|---|
| PHP, обслуживающий сайт | 8.5.12, FPM/FastCGI |
| Подключение к базе и сессии | Проверки пройдены |
| Защитный пролог и файл настроек | Подключены ожидаемые файлы |
| 16 контрольных адресов | HTTP 200 до и после переключения |
| Несуществующий контрольный адрес | HTTP 404 |
| Попытки выполнения PHP в проверенных служебных каталогах | HTTP 403 |
| Новые записи в журнале PHP за контрольный прогон | 0 байт |
В выборку вошли главная, каталог, услуги, блог, решения, контакты, проекты, карты и страница входа в административную часть. Для службы PHP-FPM настроили запуск при загрузке системы.
Границы проверки. HTTP 200 подтверждает ответ выбранной страницы. Проверка оформления заказа и реального платежа требует отдельных сценариев; такие операции не входят в приведённые 16 запросов.
Cron перевели на PHP 8.5 и проверили реальный запуск
После переключения веб-запросов обнаружили, что в расписании Битрикс всё ещё указан системный PHP 8.2.20. Страницы уже обслуживала новая версия, а фоновое задание продолжало запускать прежний интерпретатор.
В команде cron явно указали PHP 8.5.12 и его файл настроек. Сохранили расписание и существующую блокировку, которая не допускает одновременный повторный запуск задания.
Проверили команду и пользователя
Задание использует нужный интерпретатор, конфигурацию и права пользователя сайта.
Дождались срабатывания расписания
Зафиксировали процесс нового PHP с cron-скриптом Битрикс и соответствующие записи в журнале планировщика.
Наблюдение подтвердило, что планировщик использует новую команду. Оно не заменяет проверку каждого агента и каждой бизнес-операции внутри cron-скрипта.
Обработчик WebP больше не передаёт пустой путь к файлу
При проверке журнала PHP обнаружили ValueError: Path must not be empty в собственном обработчике WebP. Если исходного JPG или PNG не было, переменная с путём оставалась пустой. Затем этот путь передавался в file_get_contents(), и обработчик завершался с ошибкой.
Добавили корректную проверку исходного файла и обработку запроса. Для отсутствующего изображения стал возвращаться HTTP 404. Для существующего исходника проверили преобразование в WebP, тип ответа и повторную выдачу готового файла.
| Сценарий запроса | Результат |
|---|---|
| Прямое обращение к обработчику без изображения | HTTP 404 |
| Отсутствующий исходный файл | HTTP 404 |
| JPEG с параметрами в адресе | HTTP 200 · image/webp |
| PNG с символом «+» в имени | HTTP 200 · image/webp |
| Повторный запрос созданного WebP | HTTP 200 · image/webp |
Все пять сценариев прошли через рабочий сайт. Во время контрольного прогона новых записей в журнале PHP не появилось. Ошибку пустого пути рассматриваем как дефект обработчика, выявленный при проверке проекта.
После обновления привели в порядок видео и товарную разметку
После основного перехода продолжили проверку каталога. Эти исправления относятся к качеству страниц и данным для поисковых систем. Их результат учитываем отдельно от обновления PHP.
Отсутствующее видео
В карточке архивного товара обнаружили ссылку на отсутствующий ролик. Вместо неработающего проигрывателя вывели сообщение о временной недоступности видео. PDF-инструкцию сохранили.
Цена и наличие из карточки
Старый шаблон обрезал строку цены и всегда указывал наличие. Текст «Снята с производства» попадал в поле цены. Исправили формирование Product и Offer по фактическим данным.
Убрали фиктивные значения
Удалили gtin13=FALSE и автоматически выдуманный срок действия цены. Для архивного товара без цены оставили разметку страницы и хлебные крошки.
Организация и текстовые файлы
На главной добавили Organization и WebSite. Подготовили llms.txt и /.well-known/ai.txt; проверили их доступность по HTTP и текстовый тип ответа.
После установки дважды проверили контрольные страницы, сопоставили размеченные цены с видимыми и убедились в отсутствии новых записей PHP за время проверки. Для этого этапа также сохранили исходные файлы и подготовили откат.
Исправленная разметка даёт поисковикам согласованные данные. Рост позиций, появление расширенных сниппетов или эффект от llms.txt и ai.txt по результатам этих работ не измерялись.
Цена и наличие – только часть товарных данных. Если покупатель не находит подходящую модель через поиск или фильтры, отдельно проверяют характеристики товаров, единицы измерения и пропуски в данных. Это помогает выяснить, какие сведения теряются между карточкой товара и поисковой выдачей магазина.
PHP 8.5.12 работает для сайта и фоновых заданий
NorthRelay переведён с PHP 8.2.20 на PHP 8.5.12 на прежнем сервере. Для веб-запросов настроен PHP-FPM, для фонового задания Битрикс – явный вызов новой версии PHP. Подготовлены конфигурации, журналы, резервные копии и команды возврата к прежнему состоянию.
| Область | Подтверждённый итог |
|---|---|
| Среда выполнения | PHP 8.5.12 для сайта и его задания cron |
| Совместимость | Четыре исправления в компонентах и библиотеке проекта |
| Сборка PHP | 754 выполненных теста пройдены, 134 пропущены, 0 ошибок |
| Доступность выбранных страниц | 16 адресов отвечают HTTP 200 после переключения |
| Изображения | Пять HTTP-сценариев WebP пройдены |
| Завершение работ | Тестовые службы остановлены, резервные копии и порядок отката сохранены |
Измерения процентного ускорения, роста трафика, конверсии и выручки в этот проект не входили. Практический результат – работа нового PHP-окружения в проверенных сценариях и устранение найденных дефектов приложения.
Операционная система требует отдельного обслуживания. CentOS 7 осталась прежней; её стандартная поддержка завершилась 30 июня 2024 года. Обновление PHP не продлевает поддержку ОС. Отдельно собранные библиотеки и PHP также нужно сопровождать и обновлять.
Что важно учесть перед переходом на PHP 8.5
В этом проекте мы выполнили переход на прежнем сервере с отдельной установкой PHP. Возможность повторить такой подход зависит от ОС, библиотек, CMS и доработок. Решение принимается после инвентаризации и проверки на тестовой копии.
Команда показывает версию PHP, доступную в конкретной командной строке. Веб-сервер может использовать другой модуль или PHP-FPM. Поэтому мы проверяли версию через рабочий веб-запрос, а затем отдельно проверяли cron.
Он остался для существующих серверных инструментов. Веб-запросы и фоновое задание Битрикс были явно направлены на PHP 8.5.12. Такое разделение позволило управлять переходом каждого процесса отдельно.
Это выполненные проверки выбранного набора GD, cURL и OpenSSL. Всего набор содержал 888 тестов, из которых 134 были пропущены. Это не число протестированных страниц или операций пользователей.
Нет. Часть изменений связана с требованиями новых версий PHP, часть – со старыми дефектами компонентов. Например, запись в $GLOBALS без имени элемента и чтение файла по пустому пути требовали исправления независимо от формулировки задачи обновления.
Ответ HTTP 200 подтверждает доступность адреса в момент запроса. Дополнительно мы проверяли среду выполнения, базу данных, сессии, защитные ограничения и WebP. Заказы, платежи и другие бизнес-операции требуют собственных контрольных сценариев.
В этом кейсе таких измерений нет. Обновление среды выполнения и исправление ошибок относятся к техническому состоянию сайта. Эффект для скорости, поведения пользователей и поиска оценивают по отдельным измерениям до и после изменений.
Сначала изучают окружение, версию Битрикс, шаблон, доработки, расширения PHP и фоновые задания. Затем проверяют копию сайта и составляют план переключения. От этих результатов зависят трудоёмкость, сроки и состав проверок.
Нужно обновить PHP на работающем сайте?
Начнём с проверки окружения, компонентов и фоновых заданий. Подготовим тестовую копию, определим необходимые исправления и согласуем порядок переключения с возможностью возврата.



