0

我正在四处阅读,我知道这可能无法像我希望的那样完成,但我希望有办法,所以就这样吧..

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

一个数组,例如:$my_superglobal_arr = ('1'=>304,'2'=>763,'6'=>12,'13'=>96); 本来是完美的。

有什么建议么 ?

谢谢 !

4

3 回答 3

4

索引列的更新需要时间,对吧?

对。但是,这取决于。我强烈建议你先去数据库,获得更新和东西的实际经验,了解你可以称之为“许多”的特定数量的用户。然后才决定,如果你真的需要你不寻常的设置,是真的有必要还是只是想象中的幻想。

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

于 2011-09-07T04:39:10.967 回答
2

您需要ArrayAccess结合APC缓存功能并采用一种Singleton模式。

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 中,有一个错误可能会阻止您在单个请求期间增加单个计数器。据我所知,增加后续请求不是问题。

于 2011-09-07T04:11:33.140 回答
1

这不是 PHP 原生提供的。最好的办法是将数据存储在基于内存的键/值存储中。PHP 原生支持大多数主机提供的memcached 。你也可以看看MongoDBRedis

于 2011-09-07T03:58:16.683 回答