在PHP 5.3中重新引入$ HTTP_POST_VARS

时间:2012-10-19 16:12:15

标签: php

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

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

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

4 个答案:

答案 0 :(得分:20)

你可以这样做

的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 string

  

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

     

特殊值none禁用自动前置。

编辑:为了更加彻底,这些是其他超级全局,也可能是别名:

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

答案 1 :(得分:2)

这样的东西
$HTTP_POST_VARS = $_POST;

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

答案 2 :(得分: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文件进行设置,也可以全局设置。

答案 3 :(得分: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不存在则不显示任何内容,如果存在则显示您在querystring中发送的rnd参数

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

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