PHP自定义超全局数组问题

PHP自定义超全局数组问题,php,arrays,superglobals,Php,Arrays,Superglobals,我在四处阅读,我知道这可能是不可能实现的,因为我希望它会是,但我希望有一种方法,所以这里去 我有用户的ID,每个都有一个计数。 我希望能够将这些值存储在机器内存中,并且每隔一段时间只更新一次数据库,但绝对不会经常更新。 当然,很多用户都在访问该页面,我希望该数组与每个用户保持相关性,并根据需要进行更新。(这是我不想使用DB的另一个原因。对索引列进行更新需要时间,对吗?) 数组,例如: $my_superglobal_arr=('1'=>304,'2'=>763,'6'=>12,'13'=>96)

我在四处阅读,我知道这可能是不可能实现的,因为我希望它会是,但我希望有一种方法,所以这里去

我有用户的ID,每个都有一个计数。 我希望能够将这些值存储在机器内存中,并且每隔一段时间只更新一次数据库,但绝对不会经常更新。 当然,很多用户都在访问该页面,我希望该数组与每个用户保持相关性,并根据需要进行更新。(这是我不想使用DB的另一个原因。对索引列进行更新需要时间,对吗?)

数组,例如: $my_superglobal_arr=('1'=>304,'2'=>763,'6'=>12,'13'=>96); 那就太完美了

有什么建议吗


谢谢

这不是PHP本机提供的功能。最好将数据存储在基于内存的键/值存储中。PHP本机支持大多数主机提供的功能。您还可以查看和

您需要将
阵列访问
与缓存功能结合起来,并采用
单例模式

class UserCounter implements ArrayAccess {
    public static function getInstance()
    {
        static $instance;
        if (!$instance) {
            $instance = new self;
        }
        return $instance;
    }

    public function offsetSet($offset, $value)
    {
        apc_store(__CLASS__.$offset, $value);
    }

    public function offsetExists($offset)
    {
        return !!apc_fetch(__CLASS__.$offset);
    }

    public function offsetUnset($offset)
    {
        apc_delete(__CLASS__.$offset);
    }

    public function offsetGet($offset) 
    {
        return apc_fetch(__CLASS__.$offset);
    }

    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}
}
用法:

$user_counter = UserCounter::getInstance();
$user_counter[1] = $user_counter[1] + 1;
var_dump($user_counter[1]);
第一次请求时的输出:

int(1)
第二天:

int(2)
当需要在数据库中保存这些计数器时:

$user_counter = UserCounter::getInstance();
foreach ($users as $user_id) {
   store_counter_in_db($user_id, $user_counter[$user_id]);
}
注意:在某些版本的APC中,这可能会阻止您在单个请求期间增加单个计数器。据我所知,后续请求的增量不是问题

更新索引列需要时间,对吗

对。不过,这要视情况而定。 我强烈建议您首先使用数据库,通过更新等方式获得实践经验,了解您可以称为“许多”的用户的具体数量。然后才决定,如果你真的需要你不寻常的设置,是真的有必要还是只是想象中的幻想


阅读您的其他问题,我只能说,必须先学习SQL

您是说在单个请求期间更新数据库,还是在多个请求之间更新数据库?尝试查找Memcached或Redis,看看它是否符合要求。@zerkms阅读邮件正文,而不仅仅是标题:P@Col.弹片:欢迎回来:-)我完全同意!尽管如此,我还是遇到了一个有趣的答案。使用一个带有主机自己的缓存文件的文件似乎是一个下降的解决方案,不是吗?很好的评论,我从未听说过APC,很高兴知道它在那个里,尽管它似乎不是php的一部分,一些服务器没有它,或者不允许我安装它。请查看我对@Col.Shrapnel和链接的评论,这看起来像是下降方法吗?谢谢你的代码!感谢Memcache、MongoDB和Redis!不过,我一直在寻找php固有的解决方案。再次感谢这就是问题所在。没有一个PHP解决方案不涉及非本机扩展或其他服务。每个PHP请求都在它自己的空间中执行。从一个请求到另一个请求的任何内容都将丢失。保存此状态的唯一方法是将其存储在文件、数据库中,或将其发送到此作业的其他服务(memcached、其他数据库)。因为您希望将其存储在内存中,所以使用文件或PHP的常规会话处理(基于文件-除非您更改了会话处理)是行不通的。我同意其他意见,即您应该首先评估它为什么不能与SQL一起工作。