我在 PHP 5.3 上运行了 15-10 年的多个系统,我无法继续这些系统并进行任何更改。
问题是:其中一些系统使用的 PHPregister_globals = on在 PHP 5.3 上已经贬值,甚至在 PHP 5.4 中都不存在(http://php.net/manual/en/security.globals.php)。
我正在开发一个新系统,想转 PHPregister_globals = off但我不能,因为所有那些需要它的旧系统。
所以我考虑在我的脚本中使用动态更改register_globalsto但是文档(http://php.net/manual/en/function.ini-set.php)让我有点困惑:offstring ini_set ( string $varname , string $newvalue )
设置给定配置选项的值。配置选项将在脚本执行期间保留此新值,并将在脚本结束时恢复。
这是否意味着如果我有两个脚本同时运行,让我们说......我的一个真正需要的旧系统register_globals = on和我使用旧脚本的新系统将使用新ini_set()更改register_globals = off的设置运行?或者它会将设置保留在我的 PHP.ini 文件中,并且新系统将在ini_set()配置上运行?
- 编辑 -
经过一些测试(见下面的代码)@Jacob 是正确的,似乎 PHP 为每个脚本创建了一个上下文,并且ini_set()只更改了脚本的配置。
TestWithIni_Set.php
<?php
ini_set('register_globals', '0');
$i = 0;
while(true)
{
if($i == 0)
{
phpinfo();
}
$i++;
}
?>
TestWithoutIni_Set.php
<?php
phpinfo();
?>
所以我先跑了TestWithIni_Set.php,然后将TestWithIni_Set.php执行(无限的while循环)我跑了TestWithoutIni_Set.php。
不幸的是,看起来我无法register_globals用ini_set(). 我尝试了以下方法:
//Knowing that ini_set() parameters are strings I tried those anyway.
ini_set('register_globals', '0');
ini_set('register_globals', 0);
ini_set('register_globals', 'off');
ini_set('register_globals', 'Off');
ini_set('register_globals', false);
ini_set('register_globals', 'false');
然后为了确保我的代码没有问题,我尝试了:
ini_set('log_errors', '0');
只是想看看它是否会起作用并且确实有效。然后log_errors脚本ini_set()的值是关闭的,log_errors脚本的值ini_set()是打开的。
但现在我有一个不同的问题。
register_globals如果我不能使用 更改它,如何仅更改正在运行的脚本的值ini_set()?