Директива IfDefine не работает для загрузки модуля PHP - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь подготовить тестовую / тестовую платформу для разных версий 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?

...