我四处阅读,我知道这可能是不可能完成的,因为我希望它会是,但我希望有一个方法,所以这里去…
我有用户的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