昨天在调试代码时,在同一个sever上有两个版本的代码,刚开始在一个新版本做开发,由于需要调试旧版本的问题,因此访问旧版本代码时,发现无论访问什么都是空白页,php环境变量设置的display_errors=1,error_reporting=E_ALL,按道理不应该是空白页,最有可能的是入口程序的某一部分使用了@抑制了fatal error,刚开始以为是权限验证,后来发现似乎还没进入controller就死掉了,只好一步一步的跟踪框架的加载程序,最终发现是框架内部对session封装的类里调用:
@session_start()
导致的,看了一下调用栈,发现session_start()时,如果有对象保存在session中,会自动调用这个对象的__wakeup将这个对象反序列化,同理,在session赋值后,如果是直接将对象保存在session中也会自动调用这个对象的__sleep方法将这个对象序列化。而框架定义了自己的spl_autoload,因此在旧版本里寻找新版本的对象定义时,找不到对应的类文件,因此会导致一个fatal error,从而变成空白。
我的CHM格式PHP手册没有对这个隐含的序列化和反序列化说明,以下是PHP官网对serilize()函数中提到的:
原文地址:http://www.phpbuilder.com/manual/language.oop.serialization.php
If you are using sessions and use session_register() to register objects, these objects are serialized automatically at the end of each PHP page, and are unserialized automatically on each of the following pages. This basically means that these objects can show up on any of your pages once they become part of your session.
It is strongly recommended that you include the class definitions of all such registered objects on all of your pages, even if you do not actually use these classes on all of your pages. If you don't and an object is being unserialized without its class definition being present, it will lose its class association and become an object of class stdClass without any functions available at all, that is, it will become quite useless.
翻译过来是:
如果你是用session,并且调用session_register()注册对象,这些对象会在每个PHP页面的运行结束后自动序列化,也会在其他页面自动反序列化。这基本上意味着这些对象一旦成为session的一部分,他就能在你的各个页面中使用。
即使你再其他页面不使用一些类定义,也强烈推荐你在所有页面include全部像这样进行过session注册对象的类定义文件。如果你不这么做的话,如果一个对象在一个看不到它的类定义的情况下反序列化时,他就变成一个不包含任何函数的stdClass,也就是说这个对象基本是一个没有意义的对象了。
分享到:
相关推荐
一种常见的做法是将对象序列化后保存到Cookie中。Cookie是一种小型文本文件,服务器可以将其发送到用户的浏览器,并在后续请求时由浏览器返回,这为临时存储用户状态提供了便利。 **序列化** 是将对象的状态转换...
tomcat kryo序列化,msm-memcached-session-manager-tc7-1.8.2
- **Flexjson**:一个轻量级的JSON库,可以用于将Java对象序列化为JSON,适合简单场景。 - **Java序列化**:Java自带的标准序列化机制,简单易用,但相对较慢且序列化后的数据较大。 4. **Memcached与Tomcat整合*...
综上所述,“tomcat-7.0.47-memcached-各种序列化策略-session共享”这个主题涉及到的核心知识点包括Tomcat的Session管理、Memcached的使用、以及不同序列化策略的比较与选择。通过这些技术,我们可以构建一个高可用...
tomcat kryo memcache session序列化 msm-memcached-session-manager-1.8.2
主要给大家介绍在php中是如何使用session实现保存用户登录信息的,涉及到php session 用户登录等一些知识点,使用session保存用户登录信息要比cookie安全很多。感兴趣的朋友一起学习吧
1. **持久化存储**:对象序列化允许将对象的状态保存到磁盘,以便稍后读取和恢复。 2. **跨网络传输**:在网络应用中,可以通过序列化将对象转换为字节流,然后在网络上传输,接收端再反序列化成对象。 3. **分布式...
3. **数据库表设计**:为了存储Session数据,我们需要在数据库中创建一个表,通常包含以下字段:`session_id`(Session ID)、`session_data`(Session 数据,通常是序列化后的字符串)、`expires`(Session 过期...
如果应用程序不需要跨多台服务器共享会话状态,使用`InProc`模式可能是一个更好的选择,因为它不强制要求所有对象都是可序列化的。 ### 结论 在处理会话状态时,理解和遵循序列化规则至关重要。通过采用上述策略,...
在`apache-tomcat-7.0.47-memcached`的配置中,你需要选择合适的序列化策略,并将其配置在Tomcat的`context.xml`或`server.xml`文件中,通过`MemcachedSessionManager`来实现Session的存取。配置项可能包括序列化类...
例如,如果使用了`__wakeup()`魔术方法,在反序列化对象时,该方法会被自动调用。如果`__wakeup()`方法被用于执行恶意代码,这将构成一个安全风险。因此,开发者需要确保此类方法不会被恶意利用。 ```php class ...
Session 对象主要用于保存用户的各种信息,直到它的生命周期超时(一般是20分钟)或者被人为释放为止。 Session 对象的主要方法 1. 服务器上通过 Session 来分别不同的用户-->sessionID: 任何连接到服务器上的...
然而,PHP默认将Session数据保存在文件系统中,这在高并发或需要持久化Session数据的情况下可能不理想。为了克服这些问题,开发者可以选择将Session数据保存到数据库中。本文将详细探讨如何实现这一功能,特别是通过...
nginx+tomcat7+session共享 kryo序列化所需要包 1.将上面所提到的包全部拷贝到tomcat的lib下(三台tomcat都需要) 2.修改每台tomcat的conf目录下得context.xml文件或者server.xml文件,在其中加入如下任意一段代码...
SSHnote session函数的对象状态转换是Hibernate框架中一个关键的概念,涉及到如何管理数据库中的持久化对象。在Hibernate中,对象有三种基本状态:瞬时(Transient)、持久化(Persistent)和脱管(Detached)。理解...
在Java中,对象序列化主要涉及到`Serializable`接口的使用。 `Serializable`接口是一个标记接口,这意味着它不包含任何方法,它的作用只是表明实现了该接口的类的实例是可序列化的。当一个Java对象需要被序列化时,...
在ASP.NET开发中,购物车类的序列化与反序列化是常见的操作,尤其是在处理用户会话(Session)数据或存储临时数据时。序列化是将对象的状态转换为可存储或传输的形式,而反序列化则是将这种形式的数据恢复为原来的...
由于Session中的对象是以序列化的形式保存的,因此在恢复时需要使用`unserialize()`函数来还原对象。示例如下: ```php <?php session_start(); include_once 'Person.php'; // 检索Session中的Person对象 if (is...
在JSP开发中,有一些内置的对象(也称为隐含对象或隐藏对象),这些对象无需显式声明即可直接使用。这些内置对象极大地简化了JSP页面的编写,并提供了丰富的功能支持。 #### 二、内置对象介绍 JSP内置对象是预定义...