警告全文如下:

  PHP 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

  关于这个问题, 网上有多种解决办法, 但都是不知所以然的答案, 那么真正的原因是什么呢, 怎么解决呢?

  请首先记住这一点. 在PHP4.2开始, register_globals默认设置为了OFF.

  在4.2.3以后, 为了兼容以前的模式, PHP引入了bug_compat_42, 当启用这个选项以后(默认启用), PHP将容许自动将SESSION中的变量做为全局变量使用. 只不过如果bug_compat_warn选项开启的情况下, 会报告这个特性的被使用.

  来看一段代码,

  session_start();

  var_dump($_SESSION);

  $name = 'laruence';

  $_SESSION['name'] = null;

  ?>

  上面的代码, 在bug_compat_42开启, register_globals关闭的情况下, 俩次刷新页面的输出, 分别为:

  //第一次:

  array(0) {}

  //第二次

  array(1) { ["a"]=> string(8) "laruence" }

  为什么第二次不是NULL呢, 因为在bug_compat_42开启的情况下, PHP会认为变量a是$_SESSION['a']的一个引用, 在session_close的时候, 会把变量a的值回写.

  而在这个过程中, 如果bug_compat_warn开启, 则会抛出文章开头的警告.

  So, that it is~

  那么, 它具体给出警告的条件是什么呢? 知道了这些条件, 我们就可以避免这个警告了,

  在PHPSRC/ext/session/session.c中, 有我们想要的一切答案:

  static void php_session_save_current_state(TSRMLS_D) /* {{{ */

  {

  int ret = FAILURE;

  IF_SESSION_VARS() {

  //如果存在Session数组

  if (PS(bug_compat) && !PG(register_globals)) {

  HashTable *ht = Z_ARRVAL_P(PS(http_session_vars));

  HashPosition pos;

  zval **val;

  int do_warn = 0;

  zend_hash_internal_pointer_reset_ex(ht, &pos);

  while (zend_hash_get_current_data_ex(ht

  , (void **) &val, &pos) != FAILURE) {

  if (Z_TYPE_PP(val) == IS_NULL) { //变量为null

  if (migrate_global(ht, &pos TSRMLS_CC)) {//变量回写

  do_warn = 1;

  }

  }

  zend_hash_move_forward_ex(ht, &pos);

  }

  if (do_warn && PS(bug_compat_warn)) {

  php_error_docref(NULL TSRMLS_CC, E_WARNING, "Your script possibly

  relies on a session side-effect which existed until PHP 4.2.3 ..........");

  //后面省略

  可见, 如果不开启bug_compat_42(现在很少用到这个特性, 开启的话有的时候反而会造成迷惑), 或者不开始bug_compat_warn, 或者在register_globals开启的情况下, 都不会看到这个警告.

  另外, 如果开启bug_compat_42, 还可能遇到如下的NOTICE..

  PHP Notice: Unknown: The session bug compatibility code will not try to

  locate the global variable $324324 due to its numeric nature in Unknown on line 0

  这是当你在$_SESSION中使用数字索引的时候, 可能会引发的警告.

PHP.ini

; Whether or not to register the EGPCS variables as global variables. You may
; want to turn this off if you don't want to clutter your scripts' global scope
; with user data.
; You should do your best to write your scripts so that they do not require
; register_globals to be on; Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
; http://php.net/register-globals
register_globals = Off 改成 On

[转]PHP Session的一个警告的更多相关文章

  1. mysql编译时报的一个警告warning: type-punning to incomplete type might break strict-aliasing rules,可能是bug

    cmake的时候报了一个警告: /softdb/mysql-5.5.37/storage/innobase/handler/ha_innodb.cc:11870: warning: type-punn ...

  2. QApplication::alert 如果窗口不是活动窗口,则会向窗口显示一个警告(非常好用,效果就和TeamViewer一样)

    void QApplication::alert(QWidget * widget, int msec = 0)如果窗口不是活动窗口,则会向窗口显示一个警告.警报会显示msec 毫秒.如果毫秒为零,闪 ...

  3. 同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId

    同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId >>>>>>>>>>>>>& ...

  4. JSP中,EL表达式向session中取出一个attribute和JSP脚本访问session取出一个attribute,写法有何不同?(转自百度知道)

    EL表达式使用起来会更简洁,假如session中有一个属性A(attrA),那么EL和jsp脚本取值的方式如下: EL表达式:${ sessionScope.attrA } JSP脚本:<%=s ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示一个警告的操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. session的一个问题

    <%@ page language="java" import="java.util.*,javax.servlet.http.Cookie.*" pag ...

  7. Session问题-一个部门A登录后未注销另一个部门B再登录,以B的身份操作A的成员

    当管理员A登录后,打开某个管理界面.在A和B权限菜单相同的情况下,管理员B新开页面登录,session变为B的,然后切换到A打开的界面,不刷新的情况下可以操作A的数据. 解决方案:当浏览器登录后,即存 ...

  8. 在MDK 中忽略(suppress) 某一个警告

    文章转载自:http://www.51hei.com/bbs/dpj-29515-1.html 有时候我们需要在MDK中忽略掉某一个具体的warnning,怎么做呢? 只需在Misc Control中 ...

  9. react-native 调用 TouchableOpacity (触摸透明) 时报了一个警告

    `useNativeDriver` is not supported because the native animated module is missing. Falling back to JS ...

随机推荐

  1. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  2. C#为什么不采用多继承:

    C#为什么不采用多继承: 1.继承从来未被广泛使用. 2.多继承带来的问题往往多于其解决的问题. 3.多继承会引起潜在的歧义. C#核心编程

  3. django进行model字段的自定义

    相信大家一定有web应用被攻击的经历,数据库安全是一个网站的必须课.django有很好的orm,但sql注入,或其他方式的攻击都是无法完全屏蔽的. 所以一般数据库都会对用户数据,如text类型的数据进 ...

  4. Axis2测试webservice server以及client

    一.环境搭建 下载axis2-1.6.2-war.zip/axis2-1.6.2-bin.zip等. 参考axis2-1.6.2-war\README.txt以及axis2-1.6.2-war\axi ...

  5. Ruby-1

    Ruby API 文档 http://www.ruby-doc.org/core-2.0.0/ Programming Ruby http://ishare.iask.sina.com.cn/f/22 ...

  6. 获取局域网中指定IP或是主机名称的所有文件夹及其搜索文件

    最近做个功能在局域网中所有指定文件,于是花了点精力完成了部分功能,先贴上 using System; using System.Collections.Generic; using System.Co ...

  7. 第9章 硬件抽象层:HAL

    HAL(硬件抽象层)是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层.在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件 ...

  8. i2c总线,设备,驱动之间的关系

    ------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...

  9. jieba中文分词(python)

    问题小结 1.安装 需要用到python,根据python2.7选择适当的安装包.先下载http://pypi.python.org/pypi/jieba/ ,解压后运行python setup.py ...

  10. Protobuf C#教程 ThriftC#教程大合辑

    android与PC,C#与Java 利用protobuf 进行无障碍通讯[Socket] http://www.cnblogs.com/TerryBlog/archive/2011/04/23/20 ...