Можно ли сохранять много информации в $ _SESSION? - PullRequest
8 голосов
/ 03 мая 2011

Мне нужно хранить множество массивов в $_SESSION, чтобы предотвратить получение информации из MySQL. Это нормально? Сколько "слишком много" информации в $_SESSION или нет "слишком много"? Спасибо.

P.S. Или лучше использовать http://php.net/manual/en/book.memcache.php?

Ответы [ 5 ]

3 голосов
/ 04 мая 2011

Предел данных, которые вы можете хранить внутри сессии, ограничен слоем хранения сессии. Хранилище сеансов по умолчанию - файловая система, и один сеанс хранится в одном файле. Имя переменной сеанса / ключа массива сохраняется вместе с данными в сериализованной форме . Символ канала отделяет имена и значения переменных друг от друга.

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

Размер файла ограничен файловой системой. Например, в EXT3 это 16 гигабайт на файл. Так что это одно "слишком много". Вы не можете хранить больше данных в сеансе, чем позволяет уровень хранения.

Следующий предел, который я могу вспомнить, - это предел вашей памяти. Так как PHP необходимо загрузить данные из файла в память и сохранить их из памяти в файл в конце запроса. Так что если у вас есть ограничение памяти в PHP , то это фактически ограничит также размер вашей сессии. Например, стандартное ограничение памяти в PHP 5.2 составляет 16 МБ, но это может варьироваться в зависимости от вашей установки.

Кстати, использование всей памяти для сессии не имеет особого смысла.

Рядом с этими жесткими ограничениями могут быть ограничения производительности, связанные с количеством постоянных запросов, скоростью вашего жесткого диска и т. Д.

Поскольку ваш вопрос довольно короткий, я предполагаю, что вы до сих пор не сталкивались с какими-либо конкретными проблемами, поэтому я думаю, что это будет выходить за рамки. Например. использование memcached, если вам это не нужно, было бы только накладными расходами. А также обсуждение проектных решений (никогда не кэшируйте в сессиях), на которые вообще нельзя ответить.

100 или 200 килобайт на сессию (найдите каталог сессий в вашей системе и посмотрите, насколько большими будут файлы), не должны нарушать вашу программу. Как и предполагалось, вам следует позаботиться о том, чтобы старые ненужные файлы сеансов больше не удалялись через определенный промежуток времени автоматически.

Чтобы узнать больше о конфигурации вашего сеанса в PHP, см. Настройка времени выполнения сеанса в руководстве по PHP .

3 голосов
/ 03 мая 2011

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

Лично я сохранил дюжину или около тогообъекты данных (обычно результаты базы данных, относящиеся к пользователю) в сеансах.Сайт был на интранете компании, обслуживающей около десяти тысяч запросов в час.Это было быстро, и нагрузка была низкой.Если бы мне нужно было угадать, что каждая сессия была размером около 100 КБ.

Я бы не рекомендовал хранить в сеансе намного больше, чем один или два мегабайта.Вам также нужно убедиться, что PHP и Apache (IIS, что угодно) тоже убирают за собой.Если вы сохраняете много данных сеанса, временное пространство заполняется быстро.

Если вы действительно хотите сделать что-то подобное молниеносно и иметь наличные деньги, выберите SSD-накопитель.Это сделает поиск еще быстрее.

Надеюсь, это поможет.

2 голосов
/ 03 мая 2011
1 голос
/ 03 мая 2011

Количество данных в вашей сессии будет влиять на производительность.Если вы собираетесь использовать файлы для сессии, учтите, что php может оказаться узким местом на диске.Чтение, запись и сериализация этих данных может повлечь за собой тяжелый дисковый ввод-вывод, что плохо.

Что касается жесткого верхнего предела, я подозреваю, что эти ограничения такие же, как у вашей файловой системы.Например, если вы сохраняете огромные объемы данных в сеанс и заполняете свой диск, вы не сможете записывать дополнительные сеансы.

Использование memcached устранит проблемы производительности дискового ввода-вывода, так какзапись и чтение из memcached намного быстрее.Ваши ограничения будут 1 МБ на сессию согласно спецификации memcached.Ваше общее пространство для сеансов будет соответствовать размеру запускаемого вами экземпляра memcache (определяется флагом -m при запуске экземпляра memcache).

1 голос
/ 03 мая 2011

$ _ SESSION - это , а не для кэширования.

Если вам нужно что-то кэшировать, используйте APC или Memcached или даже Redis .

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