警告全文如下:

  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. 调试 zeromq 发现 accept 死循环

    起因:在群里一个同学说使用 zeromq 的时候出了点儿问题,问题描述如下“router连接十几万客户端后,然后把router杀死,重启,这时候zeromq的某个线程99%的cpu,卡死了,再也接受不 ...

  2. 一维码生成 c# winform GUI

    最近看到同事小红在做一维码,感觉挺好玩,于是就在网上找了一个例子来玩玩. 下面的代码均为网上的代码,做了一些整理,但是忘记了出处,原作者看到可以提醒我,谢谢. 首先,一维码的相关知识可以先百度一下:h ...

  3. 团队第二周:SRS文档

    项目计划: 对于这次的实验,我们组计划进行一个图书管理系统的项目书写,在第一阶段,对该项目先进行一下规划,总结该项目的注意事项以及实验要求,并加以实施. 下面我先对我们项目的要求坐一下说明: 1定义五 ...

  4. mybatis中的#{}和${}

    #{}:相当于预处理中的占位符?. #{}里面的参数表示接收java输入参数的名称. #{}可以接受HashMap.简单类型.POJO类型的参数. 当接受简单类型的参数时,#{}里面可以是value, ...

  5. html5 请求的URL转成 OC可用属性字符串显示

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:helpUrlStr]]; NSString *string = [ ...

  6. [解决方案] pythonchallenge level 2

    http://www.pythonchallenge.com/pc/def/ocr.html 根据页面提示查看网页源代码,在最后:<!--find rare characters in the ...

  7. python27(32位)安装RTree

    一开始用pip install -r requirements.txt 报错:OSError: could not find or load spatialindex_c.dll 1)从以下链接下载编 ...

  8. 第一篇博文,整理一下关于Mac下安装本地LNMP环境的一些坑

    安装的主要步骤是按照以下这篇文章进行的http://blog.csdn.net/w670328683/article/details/50628629,但是依然遇到了一些大大小小的坑(一个环境搞了一天 ...

  9. SQLServer数据库转换成MySQL数据库

    由于工作需要,系统原先的SQLServer数据库要转换成MYSQL数据库,所以这两天就一直在查阅这方面的资料.最开始,我尝试从SQLServer中导出SQL文件,然后导入到MYSQL数据库中,发现报错 ...

  10. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...