Повторно ввести $HTTP_POST_VARS в PHP 5.3
Мне нужно запустить устаревшее приложение PHP в среде совместного размещения. Я пообещал своему клиенту, что некоторое время поддерживаю это устаревшее приложение, но обнаружил, что он не работает, потому что он широко использует устаревший $HTTP_POST_VARS
.
Снижение рейтинга PHP не является вариантом. Исправление приложения может быть неосуществимым, поскольку файлы PHP генерируются из исполняемого файла Windows (я не шучу!), И каждый раз, когда сайт восстанавливается с рабочего стола, мы можем потерять изменения.
Я спрашиваю, есть ли способ сказать PHP повторно ввести $HTTP_POST_VARS
для всех сайтов на хосте или только для определенного vhost. Любые другие варианты/предложения оценены
Ответы
Ответ 1
Вы можете сделать это
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 отключает автоматическое добавление.
РЕДАКТИРОВАТЬ: Чтобы быть более тщательным, это другие суперглобалы, которые также могут быть псевдонимом:
$HTTP_SERVER_VARS = &$_SERVER;
$HTTP_POST_FILES = &$_FILES;
$HTTP_SESSION_VARS = &$_SESSION;
$HTTP_ENV_VARS = &$_ENV;
Ответ 2
Как насчет чего-то вроде
$HTTP_POST_VARS = $_POST;
Если вы можете включить код на страницах, это должно сработать. Конечно, вы должны иметь доступ к исходному коду и перекомпилировать exe в windows, но вы сказали, что можете.
Ответ 3
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 файлы, а также установить его глобально.
Ответ 4
Похоже, что следующее может работать.
Сначала создайте 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;
}
?>
Этот код может быть обобщен и повторно использован с любой другой программой, требующей старых длинных массивов
Затем в конфигурации Apache vhost добавьте
SetEnv EDISPLAY_PATCH true
Перезагрузите Apache.
Тестовый код работает: если SetEnv отсутствует, ничего не отображается, если присутствует, показывает, что вы отправляете как параметр rnd
в querystring
<?php
echo $HTTP_GET_VARS['rnd'];
//phpinfo();
?>
Небольшой недостаток: я включаю файл в каждый запрос PHP