PHP一个自定义的SUPERGLOBAL数组问题

时间:2011-09-07 03:54:26

标签: php arrays superglobals

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

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

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

有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:2)

您需要将ArrayAccessAPC缓存功能结合使用,并采用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]);
}

注意:there is a bug可能会阻止您在某些版本的APC中在单个请求期间递增单个计数器。正如我所知,后续请求的增加不是问题。

答案 2 :(得分:1)

这不是PHP本身提供的东西。您最好将数据存储在基于内存的键/值存储中。 PHP原生支持大多数主机提供的memcached。您还可以查看MongoDBRedis