使用Cookie管理大量动态变量

时间:2014-08-17 22:15:58

标签: php wordpress session cookies logout

我正在建立一个主持在线游戏的网站。在这个游戏中有很多角色和怪物。其中每个都有自己的基数组,以确定每个特定字符的详细信息。我有一个主角色表/管理页面来更改/修改这些字符。

目标:

  • 我需要加载一次字符信息,无论用户去哪个页面或刷新页面。如果角色没有改变,我不希望服务器重新计算所有内容。如果角色改变了统计数据或者他们改变为新角色,我需要重新计算角色。

当前解决方案:

  • 我传递角色ID,charID作为URL参数。函数检查它是否是新字符或相同。它会检查角色的上次更新时间。它还检查是否有cookie" _created_date"以及日期是什么。如果它没有看到cookie,或者角色已经更新,则会为角色信息构建新的cookie。此功能可动态构建40-60个包含各种信息的cookie。

问题:

  • 当函数看到它应该重建cookie时它会这样做,但它也会注销用户。我想这是因为我没有正确地取消cookie。我想我也没有设置登录cookie。

问题:

  1. 使用Cookie是以客户为基础在客户端管理所有这些信息的正确方法。我觉得是这样的。但这是我第一次在这个规模上做过任何事情。
  2. 管理一组Cookie的最佳方法是什么?在一个cookie数组?他们都应该有相同的前缀吗?
  3. 如何在不弄乱网站上任何其他Cookie的情况下删除/取消设置这组Cookie?
  4. 我看到使用/ tools和/ tools / edit_character构建cookie。 (函数检查大约6个不同页面上的cookie状态。)是否所有这些页面都在同一目录下?删除/取消设置目录中的cookie也会删除子目录中的那些吗?
  5. 我应该坚持使用会话变量还是将它们过期日期?如果他们在几天后回来。
  6. 我已经看到如何将所有这些cookie传递给客户端,这大大节省了服务器资源和时间。但是,一直记录我的用户是一种糟糕的用户体验,我真的需要纠正。

    网站是在apache服务器,mysql,php,jQuery,js,ajax,wordpress base(执行此操作的页面都是自定义模板)。

    感谢您的建议和帮助。如果我能提供任何其他信息,请告诉我。

    这只是cookie构建功能的一部分。

    function fyxt_setActiveCharCookie ($charID, $fyxtAccountID) {
        global $wpdb;
        setcookie("charID",$charID);
        $charLvl = curBaseCharLvl($charID);
        setcookie("charLvl", $charLvl); //sets session var
    
        //Begin to build character information /////////////////////////////////////////////////////////////////////
        $isNPC = isNPC($charID);
        setcookie("isNPC", $isNPC); //sets session var
        if ($isNPC == 1) {
            $hordeSize = hordeSize($charID);
            setcookie("hordeSize", $hordeSize); //sets session var
            $charL1Info = getNPCInfo($charID);
            foreach ($charL1Info as $n=>$v) {
                    setcookie($n, $v); //loop to set vars for all char info
            }
       }
    }
    

    取消设置功能

    function fyxt_unsetActiveCharCookie () {
        foreach ($_COOKIES as $c_id => $c_value)
        {
            if ((strpos($c_id,'wordpress') !== false) || (strpos($c_id,'wp') !== false) || (strpos($c_id,'phpbb3') !== false) || (strpos($c_id,'__ut') !== false) || (strpos($c_id,'PHPSESSID') !== false)) {
                //don't delete
            } else { 
                setcookie($c_id, NULL, 1, "/fyxt-rpg-tools/", ".fyxtrpg.com");
            }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

建议不要将Cookie用作逻辑,权限或敏感信息(如字符)等任何信息的存储空间。使用会话或文件,并仅为cookie中的用户提供唯一ID以引用此文件。但要确保文件不会被劫持(我指的是会话劫持)。

要将信息保存在文件中,请使用序列化的php数组,并将其与PHP5函数一起写入文件,然后再从中读取并将其保存在数组中,以便在脚本中进一步使用。

http://ch1.php.net/manual/en/function.serialize.php http://ch1.php.net/manual/en/function.unserialize.php http://ch1.php.net/manual/en/function.file-get-contents.php http://ch1.php.net/manual/en/function.file-put-contents.php

答案 1 :(得分:0)

看了这个并尝试了一些事情后我决定在数据库中添加一个中间表。在此表中,我将存储计算出的角色统计数据。然后我可以通过一个选择轻松检索这些。

此中间表也有助于解决我在保持多个字符“在内存中”以进行更高级的计算和比较时遇到的问题。这种方式存储在一个可以被引用的表中,而不是在服务器或用户的计算机上存储一堆变量。

这似乎也对服务器负载产生了很好的影响。我检索字符信息并在升级或其他字符更改后重写表中的这一行。如果没有更改,我可以保存最初从此中间表中检索的数组。