首先,对不起,如果这篇文章发牢骚,但我整天都试图建立一个基本的登录系统而感到沮丧。我想我现在已经开始工作,希望我的代码可以帮助其他人,但我仍有疑问。
我创建了一个自定义User类。我创建了一个验证密码哈希的登录脚本。然后我将此User对象存储在会话中。但是当我在下一页上检索User对象时,它不是正确的类,它是__PHP_Incomplete_Class,这意味着我无法使用任何自定义函数来处理该Class对象。
所以,Google和SO以及所有地方都说我必须在开始会话之前声明该类,并且当我将它们存储在_session中时,这些对象会被apache自动序列化。但是,只有在手动序列化和反序列化用户时,我的对象才有效。
例如,这不起作用:
//page1:
require_once('UserClass.php');
session_start();
$User = new User;
$_SESSION[User] = $User;
//page 2:
require_once('UserClass.php');
session_start();
$User = $_SESSION[User];
$User->doSomething();//##ERROR
但这种方法确实有效:
//page 1:
require_once('UserClass.php');
session_start();
$User = new User;
$_SESSION[szUser] = serialize($User);
//page 2:
require_once('UserClass.php');
session_start();
$User = unserialize($_SESSION[szUser]);
$User->doSomething();//winning!
我讨厌我必须手动序列化我的对象。我确定将来忘记这会导致问题。我希望我的服务器能为我做这件事。
我的第一个代码方法有问题吗?或者我的lunarpages服务器是愚蠢的?也许有一个必须在配置或htaccess中更改的设置。我在共享主机上,所以我的变更能力非常有限。有没有一种最佳实践方法来处理这个问题而不放弃使用_sesssion?我刚读了另一个SO答案,我可以使用Class __sleep()和__wakeup()函数,但那些不是支持一些私有财产,我不确定他们是否会被我对_session的调用所触发。
如果它有帮助,这里是来自phpinfo()的可能相关的部分
PHP Version 5.5.26
session
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
Directive Local Value Master Value
session.auto_start On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file /dev/urandom /dev/urandom
session.entropy_length 32 32
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 4 4
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path no value no value
session.serialize_handler php php
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies On On
session.use_only_cookies On On
session.use_strict_mode Off Off
session.use_trans_sid 0 0
提前感谢您提供的任何配置更改或其他建议。