将它存储在每个页面加载的会话或查询数据库中?

时间:2011-02-25 19:57:32

标签: php session serialization

哪条路线更好?

我应该将对象存储在会话中并将其从一个页面传递到另一个页面,还是应该在每次用户迁移到我的Web应用程序中的另一个页面时查询数据库?

如果我应该将对象存储在会话中,我该怎么做?我已尝试使用序列化和反序列化,但它对我不起作用...

感谢您的帮助!

编辑:这是我的一些代码

Page 1:
include "user.php";
session_start();
$user = new user();
$user->$username = "Jason";
$_SESSION["user"] = $user;
header("Location: profile.php");

Page 2:
include "user.php";
session_start();
$user = new user();
$user = $_SESSION["user"];
echo $user->$username;

没有结果。

2 个答案:

答案 0 :(得分:8)

仅将数据存储在特定于用户的会话中。不要将会话用作缓存。糟糕的事情将来自那里(比如因数据重复而占用大量的磁盘空间)。

如果它是特定于用户的,那么只有当它相当小且经常需要它时我才会将它存储在会话中(我不会在会话中存储大于10kb的任何内容)。如果你不经常需要它,那就不要存储它。

如果不是特定于用户,则使用缓存层。您可以使用原始APC / Memcached,也可以使用抽象层,例如Cache_LiteZend_Cache ......

答案 1 :(得分:1)

我会说:

  • 如果数据经常更改,并且每个用户都需要始终保持最新值,那么您可能希望从数据库进行查询
  • 如果日期没有变化,或者不需要立即看到变化:
    • 如果每个用户的数据不同,您可以将其存储在会话中(因为会话是按用户)
    • 如果所有用户的数据相同,则应使用所有用户共享的其他缓存机制(例如APCmemcached,以避免复制


如果存储到会话,您必须自己序列化/反序列化:它已经由会话mecanism 完成(请注意,某些数据类型无法序列化 - 请参阅Sessions

如果存储到缓存(APC,memcached,files,...),您通常需要序列化/反序列化,因为那些缓存机制不知道如何存储PHP对象。