PHP пользовательский вопрос массива SUPERGLOBAL

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

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

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

Какие-либо предложения ?

Спасибо !


person Ted    schedule 07.09.2011    source источник
comment
Вы говорите об обновлении БД во время одного запроса или между несколькими запросами? Попробуйте найти Memcached или Redis и посмотрите, подходит ли он вам.   -  person whichdan    schedule 07.09.2011
comment
@zerkms читает тело сообщения, а не только заголовок: P   -  person Your Common Sense    schedule 07.09.2011
comment
@полковник Шрапнель: с возвращением :-))))   -  person zerkms    schedule 07.09.2011


Ответы (3)


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

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

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

person Your Common Sense    schedule 07.09.2011
comment
Я полностью согласен с этим! Тем не менее, я наткнулся на интересный ответ, включающий СЕССИИ, stackoverflow.com/questions/7105866/ . Использование файла с собственными возможностями кеширования файла хоста кажется отличным решением, не так ли? - person Ted; 07.09.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. Насколько я могу судить, увеличение последующих запросов не является проблемой.

person sanmai    schedule 07.09.2011
comment
Отличный комментарий, я никогда не слышал об APC, и приятно знать, что он есть, хотя он, похоже, не является частью php, и на некоторых серверах его нет или мне не разрешают его установить. Пожалуйста, проверьте мой комментарий на @Col. Шрапнель и связь, похоже ли это на заход на спуск? Спасибо за код! - person Ted; 07.09.2011

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

person six8    schedule 07.09.2011
comment
Спасибо за Memcache, MongoDB и Redis! Я искал встроенное решение php. Спасибо еще раз - person Ted; 07.09.2011
comment
Это проблема. Не существует PHP-решения, в котором не использовалось бы неродное расширение или какой-либо другой сервис. Каждый запрос PHP выполняется в своем собственном пространстве. Все, от одного запроса до другого, теряется. Единственный способ сохранить это состояние — сохранить его в файле, базе данных или отправить в другой сервис для этого задания (memcached, другие базы данных). Поскольку вы хотите, чтобы это было в памяти, использование файла или обычной обработки сеанса PHP (которая основана на файлах, если вы не изменили обработку сеанса) не будет работать. Я согласен с другими комментариями, что вы должны сначала оценить, почему он не работает с SQL. - person six8; 07.09.2011