PHP сессии для хранения большого количества данных? - PullRequest
1 голос
/ 20 января 2009

Я занимаюсь разработкой сайта для создания закладок в СМИ и ищу способ запомнить, сделал ли пользователь закладку на элемент (без необходимости заходить в БД при каждой загрузке страницы для проверки).

Раньше я не пользовался сессиями PHP, но думаю, что они сработают.

Имеет ли смысл выполнять первоначальный вызов БД, когда пользователь входит в систему, захватить все элементы, которые пользователь добавил в закладки, и сохранить массив всех идентификаторов элементов в сеансе пользователя?

Затем, когда страница загружена, для каждого из 100 элементов на странице она проверяет, есть ли идентификатор этого элемента в массиве сеанса (поэтому мы знаем, отображать ли кнопку «закладка» или индикатор того, уже в закладки).

Просто хочу убедиться, что это правильная стратегия или есть лучший способ. Будет ли это работать нормально, даже если в массиве 10 000 идентификаторов?

Ответы [ 8 ]

6 голосов
/ 20 января 2009

Также вы можете взглянуть на расширение Memcached - оно использует память сервера в качестве хранилища данных.

4 голосов
/ 20 января 2009

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

2 голосов
/ 20 января 2009

Я бы посоветовал вам заглянуть в БД, а не хранить эти данные в сеансе. Вы очень быстро засорете память на сайте с высокой нагрузкой, если там будет много информации. Просто сделайте кеширование, и все будет хорошо.

1 голос
/ 21 января 2009

Не переоценивайте, насколько плохое обращение к базе данных один раз для каждой загрузки страницы. Вы найдете множество (и множество) PHP-приложений, которые делают то, о чем вы говорите. Многие приложения извлекают различные части страницы из базы данных, получают пользовательские данные, данные форума, новости и т. Д., Поэтому при загрузке одной страницы может выполняться ~ 30 запросов.

Сохраните уникальный идентификатор в файле cookie и сохраните информацию о сеансе, которую вы хотите сохранить в базе данных, разумным способом.

Возможно, вы думаете слишком далеко вперед. Хорошим подходом здесь было бы создать функциональность, которая вам нужна разумным способом (например, на стороне сервера), отслеживать системные ресурсы (нагрузка на БД, нагрузка на веб-сервер), а затем, если вы делаете замечаете проблему, рефакторинг для ее решения.

1 голос
/ 20 января 2009

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

Имхо, вы должны сохранить данные в БД, а затем использовать некоторое кэширование для последующих чтений (например, memcache, как сказал @Mark Tyler).

0 голосов
/ 20 января 2009

Лучшее решение здесь - это иметь таблицу любимых / закладок в вашей базе данных, содержать в ней user_id и item_id и добавлять объединение в логику поиска элементов.

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

0 голосов
/ 20 января 2009

Я бы порекомендовал использовать ADODB для php. Он имеет встроенное кэширование запросов, защиту от SQL-инъекций и т. Д. Подробнее о возможностях кэширования можно узнать по адресу http://phplens.com/lens/adodb/docs-adodb.htm#caching

0 голосов
/ 20 января 2009

Что ж, если вы хотите сделать что-то нелепое, вы можете сохранить все данные в браузере клиента, используя Javascript, в каком-то объекте, который переживает изменения страницы. Я бы не рекомендовал это, так как это добавляет много головной боли, но я подумал, что со всеми странными решениями AJAX-y, это может быть интересно: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...