Мне нужно запустить устаревшее PHP-приложение в среде совместного размещения. Я пообещал своему клиенту, что некоторое время поддерживаю это устаревшее приложение, но обнаружил, что он не работает, потому что он широко использует устаревшие $HTTP_POST_VARS
.
Понижение PHP не является вариантом. Исправление приложения может быть неосуществимым, потому что файлы PHP генерируются из исполняемого файла Windows (я не шучу!), И каждый раз, когда сайт восстанавливается с рабочего стола, мы можем потерять изменения.
Я спрашиваю, есть ли способ сообщить PHP повторно ввести $HTTP_POST_VARS
для всех сайтов на хосте или только для определенного vhost. Любой другой вариант / предложение оценены
Вы можете сделать это
config.php
$HTTP_POST_VARS = &$_POST; $HTTP_GET_VARS = &$_GET; $HTTP_COOKIE_VARS = &$_COOKIE;
.htaccess
php_value auto_prepend_file /path/to/config.php
Строка PHP doc auto_prepend_file
Задает имя файла, который автоматически анализируется перед основным файлом. Файл включен, как если бы он был вызван с помощью функции require, поэтому используется include_path.
Специальное значение none отключает автоматическое добавление.
EDIT: Чтобы быть более тщательным, это другие суперглобалы, которые также могут быть сглажены:
$HTTP_SERVER_VARS = &$_SERVER; $HTTP_POST_FILES = &$_FILES; $HTTP_SESSION_VARS = &$_SESSION; $HTTP_ENV_VARS = &$_ENV;
Как насчет чего-то вроде
$HTTP_POST_VARS = $_POST;
Если вы можете включить код на страницы, это должно сработать. Конечно, вы должны иметь доступ к исходному коду и перекомпилировать exe в Windows, но вы сказали, что можете .
register_long_arrays
работает для 5.3, но они вызвали это в php 5.4
http://www.php.net/manual/en/ini.core.php#ini.register-long-arrays
И да, этот параметр имеет значение PHP_INI_PERDIR
, поэтому вы можете установить его через отдельный .htaccess или отдельные ini-файлы, а также установить его глобально.
Похоже, что следующее может работать.
Во-первых, создайте edisplaypatch.php
где-нибудь со следующим кодом
<?php if (getenv('EDISPLAY_PATCH')) { if (!isset($HTTP_GET_VARS)) $HTTP_GET_VARS = $_GET; if (!isset($HTTP_POST_VARS)) $HTTP_POST_VARS = $_POST; if (!isset($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = $_COOKIE; } ?>
Этот код может быть обобщен и повторно использован с любой другой программой, требующей старых длинных массивов
Затем в конфигурации vhost Apache добавьте
SetEnv EDISPLAY_PATCH true
Перезагрузите Apache.
Тестовый код работает: если SetEnv отсутствует, ничего не отображается, если присутствует, показывает, что вы отправляете как параметр rnd
в querystring
<?php echo $HTTP_GET_VARS['rnd']; //phpinfo(); ?>
Небольшой недостаток: я включаю файл в каждый запрос PHP