PHP Пользовательский вопрос суперглобального массива
-
27-10-2019 - |
Вопрос
Я читал вокруг, и я знаю, что это может быть невозможно сделать, так как я хотел бы, чтобы это было, но я надеюсь, что есть способ, так что здесь идет ..
У меня есть удостоверения личности пользователей, и у меня есть подсчет для каждого. Я хотел бы иметь возможность хранить эти значения в машинной памяти и обновлять БД только время от времени, но абсолютно не постоянно. Конечно, доступ к странице от многих пользователей, и я хочу, чтобы массив оставался актуальным для каждого пользователя и обновлялся по мере необходимости. (Это еще одна причина, по которой я не хочу использовать дБ.
массив, такой как: $ my_superglobal_arr = ('1' => 304, '2' => 763, '6' => 12, '13 '=> 96); Было бы идеально.
Какие-либо предложения ?
Спасибо !
Решение
Обновления тратят время с индексированными столбцами, верно?
Верно. Однако это зависит. Я бы настоятельно предложил вам сначала пойти на базу данных, получить практический опыт С помощью обновлений и прочего, узнайте, какое количество пользователей вы можете назвать «много». И только тогда решите, что если вам действительно нужна ваша необычная настройка, действительно ли это необходима или просто воображаемые фантазии.
Чтение других ваших вопросов я могу только сказать, что для изучения SQL сначала является обязательным.
Другие советы
Вам нужно соединить ArrayAccess
с Апк способности кэширования и использовать 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. Увеличение в последующих запросах не является проблемой, насколько я могу сказать.