我需要在共享托管环境中运行legacy PHP application。我已经向我的客户承诺我将支持该遗留应用程序一段时间,但我发现它不起作用,因为它广泛使用已弃用的$HTTP_POST_VARS
。
降级PHP不是一种选择。修补应用程序可能是不可行的,因为PHP文件是从Windows可执行文件生成的(我不是在开玩笑!),每次从桌面重新生成网站时,我们都可能会失去修改。
我在问是否有办法告诉PHP为主机上的所有网站重新引入$HTTP_POST_VARS
或仅针对特定的虚拟主机。任何其他选项/建议表示赞赏
答案 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请求中都包含一个文件