我是一个 php 新手,正在研究 retwis 的代码作为 redis 教程。在浏览代码时,我遇到了以下片段
function isLoggedIn() {
global $User, $_COOKIE;
if (isset($User)) return true;
if (isset($_COOKIE['auth'])) {
$r = redisLink();
$authcookie = $_COOKIE['auth'];
if ($userid = $r->hget("auths",$authcookie)) {
if ($r->hget("user:$userid","auth") != $authcookie) return false;
loadUserInfo($userid);
return true;
}
}
return false;}
function loadUserInfo($userid) {
global $User;
$r = redisLink();
$User['id'] = $userid;
$User['username'] = $r->hget("user:$userid","username");
return true;}
所以代码在这里做的是,当用户打开 index.php 时,我们调用 isLoggedIn,如果用户满足身份验证,那么我们将用户信息(id 和用户名)加载到 global $ User 变量并在其他 php 页面中使用它来显示与 session 变量非常相似的信息。
我的问题是如何正确使用全局变量?全局变量不是跨应用程序共享的(对于多个用户)吗?如果假设 user1 登录并且我们使用 user1 凭据设置 $User 然后 user2 登录,那么 $User 变量是否会被 user2 的数据更改/覆盖并为 user1 显示不正确的数据?但是在应用程序中一切正常,谁能向我解释我做错了什么?
最佳答案
PHP 没有任何应用程序级别的持久性。使用 APC 或内存缓存来存储此类值。您不仅可以从任何页面访问这些值,还可以从任何服务器以更快的方式访问。
但是这个 User 全局变量不会在可能导致冲突的多个用户之间共享吗?每个用户都有自己的副本吗? @老兄
这取决于。这将取决于你。 Memcache(顺便说一句,我向您推荐了 memcached)它“像”一个包含键和值的表
+-------+--------+
| Key | Value |
+-------+--------+
| User1 | Value1 |
| User2 | Value2 |
| User3 | Value3 |
+-------+--------+
您可以编写代码,使每个键都可以是用户 ID,而值可以是对象、序列化对象或其他任何内容。在这种情况下,您没有任何冲突。但是,如果你愿意,你可以共享相同的资源(每个人都使用相同的 key ),但我认为这不是你想要的)
关于php - 全局变量如何在 php 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29419711/