找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2060|回复: 2

[教程] PHP Session的一个警告

[复制链接]
发表于 2013-4-11 11:13:06 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
  1. 警告全文如下:
  2. <i>  PHP Warning: Unknown: Your script possibly relies on a session side-effect</i>
  3. <i>  which existed until PHP 4.2.3. Please be advised that the session extension does</i>
  4. <i>  not consider global variables as a source of data, unless register_globals is enabled.</i>
  5. <i>  You can disable this functionality and this warning by setting session.bug_compat_42</i>
  6. <i>  or session.bug_compat_warn to off, respectively. in Unknown on</i>
  7.   关于这个问题, 网上有多种解决办法, 但都是不知所以然的答案, 那么真正的原因是什么呢, 怎么解决呢?
  8.   请首先记住这一点. 在PHP4.2开始, register_globals默认设置为了OFF.
  9.   在4.2.3以后, 为了兼容以前的模式, PHP引入了bug_compat_42, 当启用这个选项以后(默认启用), PHP将容许自动将SESSION中的变量做为全局变量使用. 只不过如果bug_compat_warn选项开启的情况下, 会报告这个特性的被使用.
  10.   来看一段代码,
  11.   session_start();
  12.   var_dump($_SESSION);
  13.   $name = 'laruence';
  14.   $_SESSION['name'] = null;
  15.   ?>
  16.   上面的代码, 在bug_compat_42开启, register_globals关闭的情况下, 俩次刷新页面的输出, 分别为:
  17.   //第一次:
  18.   array(0) {}
  19.   //第二次
  20.             array(1) { ['a']=> string(8) 'laruence' }
  21.   为什么第二次不是NULL呢, 因为在bug_compat_42开启的情况下, PHP会认为变量a是$_SESSION['a']的一个引用, 在session_close的时候, 会把变量a的值回写.
  22.   而在这个过程中, 如果bug_compat_warn开启, 则会抛出文章开头的警告.
  23.   So, that it is~
  24.   那么, 它具体给出警告的条件是什么呢? 知道了这些条件, 我们就可以避免这个警告了,
  25.   在PHPSRC/ext/session/session.c中, 有我们想要的一切答案:
  26.   static void php_session_save_current_state(TSRMLS_D) /* {{{ */
  27.   {
  28.   int ret = FAILURE;
  29.   IF_SESSION_VARS() {
  30.   //如果存在Session数组
  31.             if (PS(bug_compat) && !PG(register_globals)) {
  32.   HashTable *ht = Z_ARRVAL_P(PS(http_session_vars));
  33.   HashPosition pos;
  34.   zval **val;
  35.   int do_warn = 0;
  36.   zend_hash_internal_pointer_reset_ex(ht, &pos);
  37.   while (zend_hash_get_current_data_ex(ht
  38.   , (void **) &val, &pos) != FAILURE) {
  39.   if (Z_TYPE_PP(val) == IS_NULL) { //变量为null
  40.   if (migrate_global(ht, &pos TSRMLS_CC)) {//变量回写
  41.             do_warn = 1;
  42.   }
  43.   }
  44.   zend_hash_move_forward_ex(ht, &pos);
  45.   }
  46.   if (do_warn && PS(bug_compat_warn)) {
  47.   php_error_docref(NULL TSRMLS_CC, E_WARNING, 'Your script possibly
  48.   relies on a session side-effect which existed until PHP 4.2.3 ..........');
  49.   //后面省略
  50.             可见, 如果不开启bug_compat_42(现在很少用到这个特性, 开启的话有的时候反而会造成迷惑), 或者不开始bug_compat_warn, 或者在register_globals开启的情况下, 都不会看到这个警告.
  51.   另外, 如果开启bug_compat_42, 还可能遇到如下的NOTICE..
  52.   PHP Notice: Unknown: The session bug compatibility code will not try to
  53.   locate the global variable $324324 due to its numeric nature in Unknown on line 0
  54.   这是当你在$_SESSION中使用数字索引的时候, 可能会引发的警告.
  55. <p> </p>
复制代码

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2013-4-11 11:33:19 | 显示全部楼层 来自 中国–河南–郑州

来看看········

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

发表于 2013-4-11 12:47:16 | 显示全部楼层 来自 中国–北京–北京
我去,竟然有人抢楼

评分

参与人数 1金币 +3 收起 理由
抢楼评分专号 + 3 很幸运,你获得了抢楼奖励!

查看全部评分

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-11-22 08:40 , Processed in 0.055419 second(s), 14 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表