小池有话说

bug_compat_42

2012-09-28

SAE 上面蹦出一个错误提示:

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively in Unknown on line 0

很显然,只要

ini_set('session.bug_compat_warn', 0);
ini_set('session.bug_compat_42', 0);

就可以了,但是 SAE 上禁用了 ini_set() 这个函数。

况且我很想知道是什么引起了这个错误。

两个星期之后,我终于找到了(感谢 v2ex 上的 haiyang416),链接:http://stackoverflow.com/questions/175091/php-session-side-effect-warning-with-global-variables-as-a-source-of-data

原因就是:在开启了 bug_compat_42 特性之后,$_SESSION 数组里的成员会被自动注册为全局变量,当覆盖这个全局变量时就会引发错误。

$_SESSION['var1'] = null; // 现在自动注册了一个变量 $var1
$var1 = 'something'; // 引发错误

我的解决方案是将 $_SESSION 中的变量名都改为加一个前缀的,这样就不会和局部变量重名了,不知道还有没有更好的方式。

ps 这个错误虽然简单,但是我确实花了很长时间查找原因。不写出来,对不起那些已经花掉的时间。

再ps SAE 为什么不禁用这个特性呢?