Работа с разными версиями mod_php на веб-сервере
Определение версии mod_php и выбор подходящей версии
Как узнать версию mod_php с помощью phpinfo()?
Самый прямой способ - создать файл info.php с содержимым <? phpinfo(); ?> и открыть его в браузере. В разделе Apache Environment или Server API будет указано, какой модуль обрабатывает PHP (например, Apache 2.0 Handler). Для точной версии самого модуля следует найти строку mod_php или PHP Version - это версия интерпретатора, загруженного как модуль. Цель: получить точную информацию о версии, используемой в текущем контексте. Возникающие проблемы: если файл не выполняется, а отображается как текст, значит модуль не подключён. Решение: проверить директиву LoadModule в конфигурации Apache.
Как определить версию mod_php без веб-доступа?
Используйте командную строку: apachectl -M | grep php (или httpd -M на Debian/Ubuntu). Вывод покажет загруженные модули, например php7_module (shared). Однако версия модуля в этой строке не указана; её можно уточнить по имени файла библиотеки: ls -l /etc/httpd/modules/libphp*.so. Цель: быстрая проверка без создания веб-файлов. Типичная ошибка: команда apachectl может отсутствовать - используйте абсолютный путь или httpd.
Как узнать версию mod_php из HTTP-заголовков?
При включённой директиве expose_php сервер отдаёт заголовок X-Powered-By: PHP/8.1.10. Выполните команду curl -I http://yoursite/info.php 2>/dev/null | grep -i 'X-Powered-By'. Цель: удалённая проверка без доступа к серверу. Проблема: expose_php часто отключают по соображениям безопасности - тогда этот способ не работает. Альтернатива: смотреть заголовок Server (если настроено), но он редко содержит версию PHP.
Как проверить версию mod_php по конфигурационным файлам Apache?
Откройте основной конфигурационный файл Apache (например, /etc/httpd/conf/httpd.conf или /etc/apache2/apache2.conf) и найдите строку LoadModule php7_module modules/libphp7.so. Имя файла (libphp7.so) указывает на мажорную версию PHP. Для деталей выполните ls -l /usr/lib/apache2/modules/libphp*.so. На Debian модули могут находиться в /usr/lib/apache2/modules. Цель: статический анализ конфигурации. Проблемы: файл может быть символической ссылкой - проверьте реальный путь через readlink.
Как переключить версию mod_php для разных виртуальных хостов?
На одном сервере могут быть установлены несколько версий PHP как модули. Например, libphp8.1.so и libphp7.4.so. В конфигурации виртуального хоста укажите разные директивы LoadModule или используйте
Расширенные примеры для практической работы с версиями mod_php.
# Пример 1: скрипт для вывода информации о модуле PHP в формате JSON
# info.php
<?php
header('Content-Type: application/json');
$info = [
'php_version' => phpversion(),
'sapi' => php_sapi_name(),
'modules' => get_loaded_extensions()
];
echo json_encode($info, JSON_PRETTY_PRINT);
?>Результат при открытии в браузере (пример вывода):
{
"php_version": "8.1.10",
"sapi": "apache2handler",
"modules": ["Core", "date", "libxml", ...]
}# Пример 2: команда для Debian/Ubuntu с определением версии .so файла
httpd -M 2>/dev/null | grep php
echo "Файл модуля:"
ls -l /usr/lib/apache2/modules/libphp*.soРезультат: php8_module (shared) Файл модуля: lrwxrwxrwx 1 root root 28 Jan 12 10:00 /usr/lib/apache2/modules/libphp8.2.so -> libphp8.2.so.0
# Пример 3: проверка через mod_info (требуется активация модуля info)
# В конфигурации Apache добавить:
<Location /server-info>
SetHandler server-info
Require all denied
Require ip 127.0.0.1
</Location>
# После перезагрузки: curl http://127.0.0.1/server-info?module=mod_php7.cРезультат: выводит детальную информацию о модуле, включая версию из исходного кода (Module Version: 7.4.30).
# Пример 4: переключение версий через symbolic link (CentOS 7)
# Предположим, установлены php7.4 и php8.1
# Создаём симлинк на нужную библиотеку:
ln -sf /usr/lib64/httpd/modules/libphp8.1.so /etc/httpd/modules/libphp.so
# В конфигурации указываем:
LoadModule php_module modules/libphp.so
# Перезагружаем сервер:
systemctl restart httpd
# Проверяем:
apachectl -M | grep phpРезультат: php_module (shared) # Теперь фактически загружена версия 8.1
# Пример 5: более надёжный способ с update-alternatives (Debian/Ubuntu)
sudo update-alternatives --set php /usr/bin/php8.1
sudo a2dismod php7.4
sudo a2enmod php8.1
sudo systemctl restart apache2Команды переключают системный PHP и модуль Apache. Результат после перезагрузки: apachectl -M | grep php php8_module (shared)