PHP - хранить большой массив сессии в $ _SESSION или в базе данных? - PullRequest
4 голосов
/ 05 января 2012

Мне нужно хранить большой массив во время сеанса (в настоящее время до нескольких КБ, и я бы ограничил его до 0,25 МБ максимум).

По вашему мнению и практике, лучше хранить егов $ _SESSION или в базе данных?

Скорость имеет значение, но также имеет значение использование процессора / памяти, так как оно используется на общем хосте, и я бы не хотел, чтобы они закрывали сайт из-за чрезмерного использования ресурсов.

Можете ли вы сказать, что есть диапазон размеров, в котором $ _SESSION можно использовать с уверенностью, что он будет работать хорошо?(Например, 0kb-100kB или как показали ваши практики / тесты).

Спасибо.

Ответы [ 4 ]

4 голосов
/ 05 января 2012

0,25 МБ при нормальном количестве сеансов будет использовать меньше ресурсов, если хранится в сеансе, чем в БД.Таким образом, вероятность перерасхода ресурсов с сеансом ниже.

2 голосов
/ 05 января 2012

Реальное снижение производительности в сеансах заключается в том, что PHP перезаписывает данные сеанса для каждого запроса. Запись на диск (что он и делает в большинстве случаев) очень медленная. Его следует использовать только для простых вещей, таких как аутентификация и небольшие структуры данных, например тележки для покупок и тому подобное.

В зависимости от того, какие это данные и какое программное обеспечение доступно на сервере, вы должны хранить их в базе данных или использовать решение NoSQL, такое как MongoDB, Redis или CouchDB.

Поскольку вы в первую очередь рассматриваете возможность использования сессий, я считаю, что согласованность данных не является приоритетом номер один. Если данные важны, вам следует использовать базу данных MySQL, поскольку она следует принципам ACID и сохранит ваши данные даже после того, как клиент отсоединится от текущего сеанса.

Если согласованность не важна, рассмотрите возможность использования Memcached, если она доступна.

Сводка : использовать базу данных, но не обязательно MySQL (в зависимости от того, какие это данные).

2 голосов
/ 05 января 2012

Много зависит от количества одновременных пользователей вашего сайта и вашего сервера.Так как это общий сервер, я бы использовал базу данных, если (и только если) у вас очень большое количество пользователей, но это проще и быстрее с $ _SESSION, а 200 КБ это не много.Кроме того, отказ от использования БД экономит ваше время на извлечение данных, поскольку при каждом запросе не требуется переходить назад и вперед на сервер БД и веб-сервер.

1 голос
/ 05 января 2012

Сеансы загружаются в память обычно после сохранения в файле сеанса в файловой системе при использовании обработчика сеансов по умолчанию.У вас не будет постоянных проблем с памятью в сеансах, если вы явно не используете память для хранения своих сеансов.На мой взгляд, плохо иметь большие сессии в любом случае.В дизайне должен быть какой-то фундаментальный недостаток.Если вы хотите связать данные с пользователем, это обычно достигается путем разработки базы данных таким образом, чтобы данные ассоциировались с правильными пользователями просто через внешние ключи.У вас есть возможность запрашивать небольшое подмножество этих данных вместо того, чтобы загружать большой объем данных в память и фильтровать его.Сессии действительно полезны только для аутентификации пользователей.RESTful API не будет использовать сессии вообще.Я, вероятно, должен отметить, что я склонен в пользу сети без гражданства.Сеансы сохраняют состояние между запросами.Я принял аутентификацию только в качестве допустимого варианта использования, потому что браузеры не предоставляют универсальную и безопасную альтернативу

...