Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2010, 17:30   #1
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию PHP + Memcached

Здравствуйте, программисты.

Работаю над одним проектом. Архитектура проекта такова, что на любой странице сайта, куда бы пользователь не перешел, будет выводиться большое количество информации из базы данных, из разных таблиц. Естественно, это очень большая нагрузка на сервер (при большом количестве пользователей) и я решил уменьшить эту нагрузку. Когда-то давно, вскользь читал о кешировании данных, но на том этапе мне это было не нужно и я бросил это гиблое дело. Теперь понял, что это один из способов существенно автоматизировать систему и как следствие ускорить работу проекта. Почитал теорию, затем инструкцию, установил Memcached. От вас прошу лишь пояснить мне, правильно ли я понял механизм работы Memcached.

Идея такова. Допустим, необходимо вывести количество пользователей в онлайне на сайте. Для этого в базе данных `users` в таблице `users_online` в графе `online_value` храниться и изменяется значение недавно авторизированных пользователей.

Решил сделать так:
1) Проверить кеш на наличие нужных данных
2) Если их там не оказалось, то выбираю их из БД и кеширую
3) Вывожу данные

Получилось что-то подобное:

PHP код:
<?php
// Соединяюсь с MySQL сервером и базой
mysql_connect("localhost""root""mysql_pwd");
mysql_select_db("users");

// Соединяюсь с Memcached сервером
$memcached = new Memcache;
$memcached -> connect('127.0.0.1'11211);

// Пытаюсь получить данные из кеша
$online_users $memcached -> get("online_users");

// Если данных в кеше нет то выбираю из БД данные и кеширую их
if (!$online_users) {
  
$online_users mysql_query("SELECT `online_value` FROM `users_online`");
  
$online_users mysql_fetch_array($online_users);
  
$online_users $online_users["online_value"];
  
$memcached -> set("online_users"$online_usersfalse5);
}

echo 
"Online users: ".$online_users;
?>
И возник ряд вопросов по Memcached.

1) Насколько безопасно хранить кешированные данные?
2) Можно ли каким то образом удалить/изменить эти данные?
3) Насколько я понимаю, данные хранятся на сервере. Значит, по идее, данные добавленные в кеш одним пользователем, будут видны другим пользователям? Т.е. если 1 пользователь сохранит данные в кеше с ключем "online_users" то другой пользователь сможет считать эти данные из кеша с этим же ключем?

Поясните, пожалуйста, правильно ли я понял принцип работы Memcached?
No name. Just Linel.

Последний раз редактировалось Linel; 15.12.2010 в 17:35.
Linel вне форума Ответить с цитированием
Старый 15.12.2010, 20:22   #2
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Сразу направлю Вас на истинный путь:
- Желательно кэшировать статичные данные, которые практически не меняются. Таблица онлайн пользователей постоянно меняется использовать кэширование не выгодно. Советую Вам использовать таблицы Memory MySQL или файлы.

По поводу ваших вопросов о memcached:
1) Достаточно безопасно. Основная уязвимость - переполнение буффера.
2) Да, можно. Но механизмы отличаются от работы БД или файлами.
3) Да, видят все пользователи, если используется один и тот же ключ.
Виталий Желтяков вне форума Ответить с цитированием
Старый 15.12.2010, 21:07   #3
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Цитата:
Таблица онлайн пользователей постоянно меняется использовать кэширование не выгодно.
Дело в том, что количество пользователей онлайн - может быть и приближенное значение. Мне не нужно выводить точное количество людей, которые сейчас онлайн. Следовательно обновлять кеш придется скажем, раз в 8-10 минут. Так тоже не выгодно? Или это не зависит от частоты обновления кеша?

Цитата:
2) Да, можно. Но механизмы отличаются от работы БД или файлами.
Вы меня не правильно поняли. Вернее, я некорректно поставил вопрос. Я имею ввиду, может ли злоумышленник каким либо образом изменить, подменить, удалить данные, хранимые в кеше?
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 16.12.2010, 09:15   #4
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Сначала ответы.
1)Безопасно.
2)Можно.
3)Да.
Цитата:
Вы меня не правильно поняли. Вернее, я некорректно поставил вопрос. Я имею ввиду, может ли злоумышленник каким либо образом изменить, подменить, удалить данные, хранимые в кеше?
Может, если вы будете так беспечны что оставите порт 11211 открытым для "внешних" соединений. Во всех остальных случаях только попав в систему, а попав в систему злоумышленник найдёт и более эффективные методы напакостить.

Теперь о том как нужно делать правильно.
Вам нужно сделать контроллер, через который вы будет работать с базой данных и с мемкешом. Контроллёр, должен выполянть запросы и кешировать их мемкешом, тем или иным способом следить за изменениями в безе и обнулять данные в мекеше при обновлении таблиц. Сделать всё это очень хорошо непросто но для небольших проектов это и не надо.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 16.12.2010, 09:26   #5
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Я имею ввиду, может ли злоумышленник каким либо образом изменить, подменить, удалить данные, хранимые в кеше?
Цитата:
Может, если вы будете так беспечны что оставите порт 11211 открытым для "внешних" соединений. Во всех остальных случаях только попав в систему, а попав в систему злоумышленник найдёт и более эффективные методы напакостить.
К мемкэшу взломщик может добраться через переполнение буффера. Это достаточно сложный взлом, поэтому использование кэша достаточно безопасно. Если взломщик проведёт такую атаку, то кэш будет для него не столь важной целью.
Виталий Желтяков вне форума Ответить с цитированием
Старый 16.12.2010, 10:30   #6
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Спасибо за ответы.

Цитата:
Мне не нужно выводить точное количество людей, которые сейчас онлайн. Следовательно обновлять кеш придется скажем, раз в 8-10 минут. Так тоже не выгодно? Или это не зависит от частоты обновления кеша?
Или в кеше можно хранить ТОЛЬКО статичные данные?
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 16.12.2010, 10:35   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Или в кеше можно хранить ТОЛЬКО статичные данные?
Нет, не только статичные. В вашем конкретном случае нужно просто ставить нужное вам время хранения кеша. Если данные системные или требующего немедленного обновления то контроллер(читайте мой пост выше).
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 16.12.2010, 10:37   #8
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Благодарю, вроде все на места встало.
No name. Just Linel.
Linel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
memcached. Вопрос взаимодействия Виталий Желтяков PHP 3 13.11.2010 12:49
PHP test.php?a=1&b=1 не работает передача параметров бедный_студент PHP 5 25.08.2010 23:08
Преобразование HTML-PHP в PHP с запуском в командной строке. TERAB1T PHP 4 01.06.2010 14:14