PHP пользовательский SUPERGLOBAL массив вопросов - PullRequest
0 голосов
/ 07 сентября 2011

Я читал вокруг, и я знаю, что это может быть невозможно сделать так, как мне хотелось бы, но я надеюсь, что есть способ, так что вот так ...

У меня есть ID пользователей, и у меня есть счетчик для каждого. Я хотел бы иметь возможность хранить эти значения в машинной памяти и обновлять БД только время от времени, но не постоянно. Конечно, к странице обращаются многие пользователи, и я хочу, чтобы массив оставался актуальным для каждого пользователя и обновлялся по мере необходимости. (Это еще одна причина, по которой я не хочу использовать БД. Обновления занимают время с индексированными столбцами, верно?)

массив, такой как: $ my_superglobal_arr = ('1' => 304, '2' => 763, '6' => 12, '13 '=> 96); было бы идеально.

Есть предложения?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Обновления занимают время с индексированными столбцами, верно?

правый. Однако это зависит. Я настоятельно рекомендую вам сначала зайти на базу данных, получить практический опыт с обновлениями и прочим, узнать, какое именно количество пользователей вы можете назвать "многими". И только тогда решите, действительно ли вам нужна ваша необычная установка, действительно ли она необходима или просто воображаемые фантазии.

Читая ваши другие вопросы, я могу только сказать, что сначала нужно изучить SQL.

2 голосов
/ 07 сентября 2011

Вам необходимо соединить 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. Насколько я могу судить, увеличение количества последующих запросов не является проблемой.

1 голос
/ 07 сентября 2011

Это не то, что PHP предлагает изначально. Лучше всего хранить данные в хранилище ключей / значений на основе памяти. PHP изначально поддерживает memcached , который предлагает большинство хостов. Вы также можете взглянуть на MongoDB и Redis

...