警告全文如下:

  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数据存储-读取内部存储空间数据

    内部存储空间的默认位置 data/data/应用名称 写数据,获取FileOutPutStream的方式 1.直接写死路径的方式 FileOutputStream fos = new FileOutp ...

  2. python bytes to string

    python bytes 转化成 string 会遇到如下错误: codec can't decode byte 0xff in position 5: illegal multibyte seque ...

  3. KBEngine 学习笔记

    最近开始学习 KBE 扩展技能点>_<!所以建一个随笔记录一下遇到的小问题: 问题1 :DBMgr找不到LibMysql32.dll 解决:VS 中KBE源码 默认的是Win32 ,Win ...

  4. 支持向量机(SVM)——python3实现

    今天看完soft-margin SVM就又搜了下相关的代码,最后搜到这个,第一次看懂了SVM的实现. 关于代码中cvxopt的使用,可以看下这个简单的介绍. 这里还是将代码贴在这里,里面加了自己的一下 ...

  5. POJ 1274 裸二分图匹配

    题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...

  6. Nginx反向代理配置可跨域

    由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...

  7. Nginx 开启gzip 压缩

    随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-ZIP)是一种压缩技术. 经过gz ...

  8. shell命令

    1:操作系统:人--使用-->shell(或应用程序)--呼叫-->kernel(核心)--->硬件2:查看shell的种类:# cat /etc/shells3:而这个登入系统的 ...

  9. Activity的Launch Mode

    ANDROID四种启动模式: 1.standard:默认的启动模式,每次新建一个实例对象. 2.singleTop:如果在任务栈顶发现了相同的实例则复用该实例,否则新建一个实例并压入栈顶. 3.sin ...

  10. 记录自己对EventLoop和性能问题处理的一点心得

    1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序实现结构.这种结构多是基于IO多路转接的API(select.poll.epoll之类)以reactor模 ...