我正在四处阅读,我知道这可能是不可能实现的,因为我希望它会是,但我希望有办法,所以这里......
我有用户的ID,我对每个用户都有计数。 我希望能够将这些值存储在机器内存中,并且仅在一段时间内更新数据库,但absolutley并非经常。 当然,许多用户正在访问该页面,我希望该阵列与每个用户保持相关,并根据需要进行更新。 (这是我不想使用数据库的另一个原因。更新需要时间使用索引列,对吗?)
一个数组如: $ my_superglobal_arr =('1'=> 304,'2'=> 763,'6'=> 12,'13'=> 96); 本来是完美的。
有什么建议吗?
谢谢!
答案 0 :(得分:4)
更新需要时间使用索引列,对吧?
右。但是,这取决于。 我强烈建议你先去数据库,获得实践经验的更新和内容,了解你可以称之为“很多”的特定数量的用户。然后才决定,如果你真的需要你的不寻常的设置,它是真的有必要还是只是想象中的幻想。
阅读您的其他问题我只能说,首先学习SQL是必须的。
答案 1 :(得分: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]);
}
注意:there is a bug可能会阻止您在某些版本的APC中在单个请求期间递增单个计数器。正如我所知,后续请求的增加不是问题。
答案 2 :(得分:1)