Який найнадійніший сеанс зберігання в PHP: Memcache, база даних або файли? [зачинено]


10

Що є найкращим і найбезпечнішим способом обробки сеансів PHP. Це найкращий спосіб зберігання сеансів у:

  1. База даних (надійніша, але висока вузька, низька швидкість, не підходить для веб-сайтів із високою базою даних)?

  2. Memcache (супер швидкий, але розподілено більше проблем із безпекою, шанси втратити дані при перезапуску сервера та шанси втратити дані, коли кеш заповнений)?

  3. Файли (параметр за замовчуванням, я думаю, повільний, оскільки він читає і записує з вводу / виводу файлів, менше безпеки тощо).

Який метод найкращий? Які проблеми та корисні речі кожного із цих підходів?


2
Я вважаю, що вам слід вказати, якщо ви використовуєте лише одну машину або якщо програма розповсюджується, оскільки це сильно вплине на відповіді.
Арсеній Муренко

1
@haylem - це найбільш підходяще місце для запитання, його не програмування, його концептуальна проблема програмування,
user1179459

3
Це справді невдале питання, оскільки "найкраще" залежить від конкретних обставин. "Найкраще" для Facebook, мабуть, не те саме "найкраще" для вашої особистої домашньої сторінки.
ГрандмайстерB

1
@GrandmasterB Я знаю, що ось чому я чітко запитав "Які проблеми та корисні речі кожного з цих підходів?" щоб з’ясувати, який із них найкращий для мене.
користувач1179459

Відповіді:


6

Найкраще зберігати в Memcached, оскільки ми можемо легко вирішити інші проблеми (розмір кешу, безпека тощо)

facebook є # 1 споживачем Memcached. Прочитайте, якщо цікавите: http://www.facebook.com/note.php?note_id=39391378919

Як вирішити інші проблеми?


4

Для переважної більшості щоденних додатків зберігання сесій у базах даних є прекрасним. Обсяг та рівень одночасності, з якою може працювати сервер sql, буде більш ніж достатнім. Головне, щоб кожен запис був невеликим за розміром і регулярно очищав непотрібні рядки. І власне індексація, звичайно.

Файлова система - я ніколи не бачив необхідності цього робити. Я віддаю перевагу простоті управління рядками в таблицях, а не тисячам маленьких файлів. Крім того, ви не можете запитувати файли, якщо ви хочете зануритися в статистику сесій

Майте на увазі, що за допомогою PHP його легко замінити обробниками сеансів. Таким чином, ви можете почати з одного формату пам’яті та переходити до іншого без зайвих клопотів.


4

А як щодо використання двигуна пам’яті MEMORY в MySQL?

Це не так швидко, як Memcache, але має перевагу в тому, що ви можете використовувати звичайний SQL, а також можете використовувати звичайний двигун зберігання даних, коли він не знадобиться, і перейти на MEMORY, коли кількість користувачів / запитів зростає.

Я використовую його для зберігання великої кількості статистичних даних у веб-додатку, який часто змінюється, тому він не використовується для обробки сеансів, але я думаю, що він повинен бути цілком відповідним для цієї мети.


3

У цьому дописі в блозі показані результати порівняння продуктивності різних механізмів зберігання сеансів із Magento, і вони, схоже, зробили висновок, що приблизно до 75 одночасних користувачів насправді різниці між продуктивністю між ними.

Я думаю, що на цих рівнях (у них було близько 5 транзакцій в секунду, що було б близько 430 к.с. за 12 годин), накладні витрати у всьому іншому домінують над показниками продуктивності, які ви бачите, оскільки файл / DB / Memcache / Redis всі щасливо справляться трафік, не порушуючи піт, якщо його правильно використовувати.

Це залишає інші фактори, такі як масштабованість, надійність та безпека.

Я спершу хотів би сказати, що все, що компрометує ваше зберігання файлів, також, ймовірно, може поставити під загрозу будь-що інше, оскільки зловмисник може просто змінити код вашої програми або, принаймні, виявити ключі та протоколи / облікові дані доступу до пам’яті, навіть якщо вони мають лише для читання доступ. Зберігання файлів буде добре працювати на веб-сайті з невеликим обсягом, його легко налаштувати і легко міркувати. Наскільки ви скажете, що ви потрапили на диск, читання БД також потрапить на диск, і якщо БД може кешувати його, ваша ОС також, ймовірно, кешувала файл сеансу. Крім того, його один файл читається, і ваша файлова система блискуча в тому, щоб дістатися до нього, якщо ви вже знаєте його ім'я. Якщо ви використовуєте PHP, чи знаєте ви, скільки зчитувань файлів має зробити система лише для обслуговування вашої програми? Мінус у тому, що ви можете "

Memcache є відносно швидким, і якщо ви розглядаєте рішення класів Memcache ширше (Redis тощо), є такі, які навіть обіцяють наполегливість у читанні пам'яті за швидкістю, щоб ви отримали максимум з обох світів. Вони також відносно прості в обґрунтуванні, і характер ключових значень сеансів - саме те, що вони були розроблені. Чи знаєте ви, скільки вам доведеться вкласти в сеанс, щоб заповнити одну з них? Так чи інакше, всі ваші варіанти змусять вас піти на компроміс, якщо ви досягнете їх можливостей. Диски заповнюються файлами (коефіцієнт кількості та розміру тут), сховища кеш-пам'яті заповнюють ємність, а бази даних мають обмежену кількість рядків і ті ж обмеження ємності диска, що і підхід до файлів. Крім того, ці системи поширюються лише у тому випадку, якщо ви запускаєте їх розподіленим способом. Більшість працює просто чудово за допомогою установки одного сервера. Якщо ви їх розповсюджуєте, то, ймовірно, вже є розповсюджені веб-сервери / сервери баз даних тощо, тому проблеми з розподіленою системою, безумовно, не з’являться у виборі пам’яті сеансу. Однак, коли вам потрібно 10-кратний трафік / пропускну здатність тощо, потрапляння туди набагато природніше, ніж це в схемі зберігання файлів. Деякі магазини ключів / значень також дозволять вам провести простий аналіз даних сеансу порівняно легко, але більшість не дістанеться ніде поблизу того, що може зробити SQL.

Я не впевнений, чому ви пропонуєте, що база даних може бути більш надійною, ніж інші параметри, але я отримую привабливість бази даних, оскільки ваша програма PHP, ймовірно, вже використовує її. Це означає, що ви не додаєте іншу залежність від сервера, і, ймовірно, можете повторно використовувати те саме з'єднання, яке ви використовуєте для отримання даних сеансу для отримання даних про користувача, тому вам не доведеться встановлювати один для даних, один для Memcache тощо. Якщо ви індексуєте індекс Таблиця добре, вона також буде працювати досить швидко і надає досить просту семантику, з якою ви вже знайомі для того, щоб пожинати старі сеанси або навіть аналізувати дані сеансу (я не впевнений, чому ви цього хотіли б, і якщо ви цього не зробите, це, ймовірно, не ' t значення так багато). Масштабування масштабних масштабів не настільки тривіальне, як із чимось на зразок Redis,

Я думаю, що цей вибір на початку не такий важливий. Кожен підхід має виклики та переваги та речі, про які ви повинні думати. Взагалі кажучи, ви, ймовірно, можете піти, просто використовуючи стандартні параметри PHP / будь-яку структуру, яку ви використовуєте, або навіть найпростішу справу. Якщо згодом вибір виявиться поганим, ваша аналітична робота підкаже вам, і ви будете озброєні необхідними даними, щоб зробити відповідний вибір, враховуючи специфіку трафіку, який ви отримуєте. Попереду, все, що можна розумно, - загальні міркування.


0

Це залежить від ваших потреб.

Існують деякі відмінності між файлами та сховищем бази даних. Дивіться це питання .

Однак ви можете робити те, що робиться в Rails 3 за замовчуванням, і використовувати лише зашифровані файли cookie для сеансу. Таким чином, ви шифруєте всі значення таким чином, що лише ви згодом можете їх розшифрувати (наприклад, приватні / відкриті ключі), і ви даєте клієнту можливість зберігати за вами стан.

З одного боку, це обмежує вас до 4 Кб, що насправді зазвичай достатньо (оскільки ви зазвичай хочете зберігати ідентифікатори, а не цілі об’єкти), але дійсно приємна вигода, яку ви отримуєте, - вам не потрібно турбуватися про очищення сеансу. Ви залишаєте це клієнтові, де воно насправді має бути.


2
Якщо ви не виділили статичні ресурси, щоб вони не знаходилися за межами шляху cookie, файли cookie - це фіксований податок, який потрібно сплачувати за кожен запит.
Joeri Sebrechts

jQuery і Bootstrap об'єднані близько 150 кбіт, і це без інших бібліотек. Максимум файлів cookie становить 4 кб, і зазвичай нижче 1 Кб. Якщо ОП не запитує про екстремальні обставини - хто піклується про такий вид оподаткування?
Ям Маркович

@YamMarcovic мало проблем 1) куки також надходять на сервер (користувачі, як правило, швидше завантажують, а потім завантажують) 2) зазвичай на сторінках є 100 запитів на статичні файли (зображення, js, css), тому вони можуть потрапляти в 100 кб при кожному запиті йде вгору
Миро Свртан

@MiroSvrtan Якщо ви змушуєте своїх користувачів надсилати сотні запитів на сторінку (де це коли-небудь траплялося?), Оптимізація, очевидно, не є проблемою для вас.
Ям Маркович

У мене був клієнт, на сайті якого було зроблено ~ 170 запитів HTTP, щоб завантажити головну сторінку, перш ніж проконсультуватися зі мною щодо оптимізації швидкості, тому трапляється, повірте мені. До речі, приватні / відкриті ключі - це концепція асиметричної криптографії, яка, як правило, не застосовується в цьому сценарії, коли її еквівалент симетричному шифру, лише складніший для реалізації. Крім того, більшість реалізацій зберігання сеансів покладаються на певний файл cookie, яким керує клієнт, тому переваги, описані в останньому абзаці відповіді, стосуються всіх них.
jeteon

0

У моїй конкретній ситуації я можу вам сказати, що сеанси в базі даних є причиною номер один, коли наші серверні затримки з хорошим запасом. наш стіл сесій досить швидко псується, що ми взяли на себе попереднє обрізання.

memcache звучить привабливо, але у нас занадто багато процесів, які очищають весь мембран, тому сеанси користувачів будуть занадто часто відключатися. і старіші сеанси будуть очищені, коли пам'ять заповниться ... тому більше постійних входів немає.

Незабаром ми спробуємо сеанси на основі файлів за замовчуванням.

Якщо ви турбуєтесь про безпеку своїх даних про сеанс, то не слід вносити ці дані в сеанс - і не довіряти сесії - перевіряти користувача на кожен запит.


0

Ви можете спробувати зберегти сеанс на Redis . Redis швидкий, як Memcached, але також має кілька варіантів збереження даних. Крім того, підтримуються різні клієнти PHP.

Крім того, ви можете спробувати сторонні сервіси, такі як Memcached Cloud, який має вбудовані можливості реплікації та зберігання

Розкриття інформації, я є співзасновником і організатором технічних даних Garantia Data.


2
Дякуємо за розголошення! Переконайтесь, що ви берете участь у цьому веб-сайті за межами публікацій, де ви можете згадати власну продукцію, але ми хочемо, щоб ви як людина працювали, а не ваша компанія.
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.