Я пытаюсь подготовить тестовую / тестовую платформу для разных версий PHP и разных движков PHP для Apache 2.4 MPM Prefork и MPM Event;PHP 5.6, 7.2, 7.3 и mod_php, PHP-CGI, PHP-FPM (файловый сокет), PHP-FPM (tcp сокет). Поэтому я готовлю настраиваемую конфигурацию apache (php-custom.conf) для работы со всеми версиями PHP и движком, кроме mod_phpЯ пытаюсь подготовить простую конфигурацию swithing, потому что разные модули mod_php не могут сосуществовать вместе.
Я использовал директиву Apache IfDefine , но не могу работать с директивой LoadModule для модуля PHP, даже если официальная документация Apache использует директиву LoadModule в качестве примера для IfDefine .
https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine
Итак, что я хочучтобы достичь, загрузите нужный модуль mod_php в директиву IfDefined.
Очевидно, что если я загружаю модуль php вне директивы IfDefine, он работает. Когда я пытаюсь загрузить модуль php в директиву IfDefine, он не работает. Я использовал переменные окружения, чтобы увидеть, работают ли другие директивы / команды / переменные в директиве IfDefine, и да, все они работают.
Это мой рабочий раздел конфигурации из php-custom.conf для загрузки модуля php 5.6 mod_phpи дополнительный модуль php 5.6 fpm (tcp socket). Все остальные конфигурации PHP отключены, в моем файле php-custom.conf есть только активная конфигурация PHP.
## DEFINE - php56 php72 php73
Define php_load_module php56
<IfModule prefork.c>
LoadModule php5_module modules/libphp56-php5.so
Define php_version_id ${php_load_module}
SetEnv php_env_loaded_module ${php_load_module}
<FilesMatch \.php56mod$>
SetHandler application/x-httpd-php
</FilesMatch>
SetEnv php_env_version_id ${php_version_id}
php_value session.save_handler "files"
php_value session.save_path "/opt/remi/php56/root/var/lib/php/session"
php_value soap.wsdl_cache_dir "/opt/remi/php56/root/var/lib/php/wsdlcache"
</IfModule>
<IfDefine php_load_module>
SetEnv php_env_stage0 stage0
<If "'${php_load_module}' == 'php56'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module1 56
</If>
<If "'${php_load_module}' == 'php72'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module2 72
</If>
<If "'${php_load_module}' == 'php73'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module3 73
</If>
</IfDefine>
<FilesMatch \.php56tcp$>
SetHandler proxy:fcgi://127.0.0.1:9056
</FilesMatch>
Для тестирования конфигурации я подготовил два простых файла phpinfo.php56mod , phpinfo.php56tcp с содержанием <?php phpinfo(49); ?>
. Оба файла phpinfo.php56mod и phpinfo.php56tcp показывают одинаковые переменные окружения.
_SERVER["php_env_load_module"] php56
_SERVER["php_env_load_module1"] 56
_SERVER["php_env_loaded_module"] php56
_SERVER["php_env_stage0"] stage0
_SERVER["php_env_version_id"] php56
Эти переменные окружения ясно показывают, что все директивы Define и IfDefine работают должным образом.
Но, когда я двигаюсьВ разделе LoadModule в разделе IfDefine модуль mod_php перестал работать без журнала ошибок.
## DEFINE php56 php72 php73
Define php_load_module php56
<IfDefine php_load_module>
SetEnv php_env_stage0 stage0
<If "'${php_load_module}' == 'php56'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module1 56
<IfModule prefork.c>
LoadModule php5_module modules/libphp56-php5.so
Define php_version_id ${php_load_module}
SetEnv php_env_loaded_module ${php_load_module}
<FilesMatch \.php56mod$>
SetHandler application/x-httpd-php
</FilesMatch>
SetEnv php_env_version_id ${php_version_id}
php_value session.save_handler "files"
php_value session.save_path "/opt/remi/php56/root/var/lib/php/session"
php_value soap.wsdl_cache_dir "/opt/remi/php56/root/var/lib/php/wsdlcache"
</IfModule>
</If>
<If "'${php_load_module}' == 'php72'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module2 72
</If>
<If "'${php_load_module}' == 'php73'">
SetEnv php_env_load_module ${php_load_module}
SetEnv php_env_load_module3 73
</If>
</IfDefine>
<FilesMatch \.php56tcp$>
SetHandler proxy:fcgi://127.0.0.1:9056
</FilesMatch>
phpinfo.php56mod файл больше не работает (пустая страница без журнала ошибок), но файл phpinfo.php56tcp показываетодни и те же переменные среды. Эти переменные среды показывают, что директива IfDefine все еще работает, но только директива LoadModule не выполняет свою работу там. Чего-то не хватает, чтобы заставить директиву LoadModule работать в директиве IfDefine?