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


PHP a custom SUPERGLOBAL array question

我四处阅读,我知道这可能是不可能完成的,因为我希望它会是,但我希望有一个方法,所以这里去…

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

数组,如:美元my_superglobal_arr =(304 ' 1 ' => ' 2 ' => 763,"6"=> 12,"13"=> 96);那就太好了。

有什么建议吗?

谢谢!

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

。然而,这要视情况而定。我强烈建议您首先使用数据库,获得的实际经验,了解您可以称之为"许多"的特定数量的用户。只有这样,你才能决定,如果你真的需要你的不寻常的设置,它是真的有必要还是只是想象的幻想。

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

您需要将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中,有一个错误可能会阻止您在单个请求中增加单个计数器。

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