12

我需要在共享托管环境中运行旧版PHP 应用程序。我已经向我的客户承诺,我会在一段时间内支持该遗留应用程序,但我发现它不起作用,因为它广泛使用已弃用的$HTTP_POST_VARS.

降级 PHP 不是一种选择。修补应用程序可能是不可行的,因为 PHP 文件是从 Windows 可执行文件生成的(我不是在开玩笑!),并且每次从桌面重新生成站点时,我们都可能丢失修改。

我在问是否有办法告诉 PHP 重新引入$HTTP_POST_VARS主机上的所有网站或仅用于特定的虚拟主机。任何其他选项/建议表示赞赏

4

4 回答 4

22

你可以这样做

配置文件

$HTTP_POST_VARS = &$_POST;
$HTTP_GET_VARS = &$_GET;
$HTTP_COOKIE_VARS = &$_COOKIE;

.htaccess

php_value auto_prepend_file /path/to/config.php

PHP 文档auto_prepend_file 字符串

指定在主文件之前自动解析的文件的名称。该文件被包含,就好像它是用 require 函数调用的一样,因此使用了 include_path。

特殊值 none 禁用自动前置。

编辑:为了更加彻底,这些是也可以别名的其他超全局变量:

$HTTP_SERVER_VARS = &$_SERVER;
$HTTP_POST_FILES = &$_FILES;
$HTTP_SESSION_VARS = &$_SESSION;
$HTTP_ENV_VARS = &$_ENV;
于 2012-10-19T16:45:42.670 回答
2

像这样的东西怎么样

$HTTP_POST_VARS = $_POST;

如果您可以在页面中包含代码,那应该可以。当然,您必须有权访问源代码并在 windows 中重新编译 exe,但您说可以.

于 2012-10-19T16:28:19.973 回答
2

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 文件进行设置,也可以全局设置。

于 2012-10-19T16:40:24.813 回答
0

看起来以下可以工作。

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在查询字符串中作为参数发送的内容

<?php
echo $HTTP_GET_VARS['rnd'];
//phpinfo();
?>

小缺点:我在每个 PHP 请求中都包含一个文件

于 2012-10-19T16:33:49.287 回答