在PHP 5.3中重新引入$HTTP_POST_VARS

12
我需要在共享托管环境中运行一个遗留的PHP应用程序。 我已经向客户承诺要支持该遗留应用程序一段时间,但我发现它无法工作,因为它广泛使用已弃用的$HTTP_POST_VARS
降级PHP不是一个选择。修补应用程序可能是不可行的,因为PHP文件是从Windows可执行文件生成的(我没有开玩笑!),每次从桌面重新生成网站时,我们都可能会失去修改。
我想知道是否有办法告诉PHP为主机上的所有网站或特定虚拟主机重新引入$HTTP_POST_VARS。任何其他选项/建议都将不胜感激。

2
现在我想了想,这个问题似乎也适合ServerFault... - usr-local-ΕΨΗΕΛΩΝ
4
啊...这些类型的客户...真是让人头疼啊,我理解。 - itachi
3
如果您使用的共享主机允许您设置自定义的php.ini文件,则可以启用register_long_arrays。详情请见:http://www.php.net/manual/en/ini.core.php#ini.register-long-arrays - MrCode
2
Windows可执行文件(我不是开玩笑!)...忍不住笑了 - Baba
1
爸爸有正确的方法来完成这个,而不需要使用 runkit。 - j_mcnally
显示剩余9条评论
4个回答

22
你可以做到这一点 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文档 auto_prepend_file字符串

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

特殊值none禁用了自动预先添加文件功能。

编辑:为了更加全面,这些是可能别名化的其他超级全局变量:

$HTTP_SERVER_VARS = &$_SERVER;
$HTTP_POST_FILES = &$_FILES;
$HTTP_SESSION_VARS = &$_SESSION;
$HTTP_ENV_VARS = &$_ENV;

3
这就是我在寻找那个runkit东西时想要的。 - j_mcnally

2
像这样的东西怎么样?
$HTTP_POST_VARS = $_POST;

如果您可以将代码包含在页面中,那应该是可行的。当然,您必须能够访问源代码并在Windows中重新编译exe文件,但您说过“可能”。

1
如果PHP文件存储在程序目录中而不是编译在可执行文件中,那么这将是解决方案。 - usr-local-ΕΨΗΕΛΩΝ

2

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的虚拟主机配置中添加

SetEnv EDISPLAY_PATCH true

重新加载Apache。
测试代码有效:如果未设置SetEnv,则不显示任何内容;如果设置了,则显示您在查询字符串中发送的rnd参数。
<?php
echo $HTTP_GET_VARS['rnd'];
//phpinfo();
?>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接