Подтвердить что ты не робот

Переменные сеанса: Сколько данных слишком много?

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

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

Я действительно эффективнее вообще, или я просто утомляю систему с использованием памяти?

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

4b9b3361

Ответ 1

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

Да, вы потенциально более эффективны, но не хотите, чтобы масштабировать и вот почему:


Сохранение данных в сеансах

Это вполне приемлемо для хранения некоторых данных в сеансах. Теоретически, нет предела (хотя я никогда не пытался его сломать или даже подтолкнул, просто перейдем к более эффективному решению). Однако вы будете ограничены дисковым пространством и PHP memory_limit().

Часто данные, хранящиеся в сеансах, включают такие вещи, как:

  • Usernames
  • Хэш
  • Даты регистрации
  • Другие переменные (идентификаторы/ключи группы пользователей и т.д.)
  • Flash-сообщения
  • (НЕ пароли!)

Однако есть компромисс. Если ваш трафик (и использование) увеличивается, и вы храните много данных в $_SESSION, вы, скорее всего, начнете видеть проблемы как с точки зрения использования диска, так и с использованием памяти.

Я не думаю, что есть какие-то проблемы с тем, что вы предлагаете, но помимо перечисленных вами элементов и где вышеприведенные примеры требуют ухода,

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


Местоположение данных сеанса

Вы можете найти местоположение, где PHP хранит данные сеанса, вызывая: session_save_path()

или в CLI:

php -r 'echo session_save_path(), "\n";'

Вы не упомянули свою ОС, но общие места для файлов сеанса (для разных типов ОС):

/tmp 
/var/lib/php5/
/var/lib/php/session
c:/wamp/tmp

Сессии, хранящиеся на диске, обычно имеют имена файлов, которые выглядят так: ls -al:

-rw-------  1 www www      0 2013-07-09 20:12 sess_bdsdjedmvtas5njhr5530b8rq6

Стоит отметить, что часто происходят процессы сбора мусора, которые очищают мертвые сессии после определенных периодов. Это зависит от ОС, но обычно они присутствуют с различными установками на основе LAMP.


Другие параметры хранения/подходы к сеансу

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

Как и любое другое решение, оно имеет pro и con (например, возможность запретить/выгнать пользователя, запустив запрос, а не удалив файл сеанса из /tmp)

В памяти
для более крупных (более дорогих) сайтов и особенно там, где объем одновременных пользователей высок, память быстрее считывает/записывает для очень часто используемых переменных или данных вместо того, чтобы добавлять чрезмерную нагрузку на вашу БД. Его можно и нужно записать в БД (см. кэширование с записью), но также и в памяти для эффективного доступа.

Одним из достоинств метода является кэширование памяти. Широко используемым примером PHP-совместимого решения с открытым исходным кодом является Memcached, который может использоваться на одном сервере или во многих [распределенных]. Я видел это, используемое небольшими фирмами, а также большими, и вам нужно только посмотреть, кто его использует/способствует...

Ответ 2

Все зависит от ресурсов сервера и от одновременных пользователей вашего веб-сайта/приложения.

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

Этот расчет поможет вам оценить, насколько много в вашем сценарии, очень грубо, но полезно.

EDIT: по памяти я имею в виду RAM и/или дисковое пространство, в зависимости от вашей установки.

Ответ 3

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

Но интересно, имеете ли вы в виду использование определяемых пользователем MySQL переменных. Вы можете хранить длинные строки данных в этих переменных, и они занимают ОЗУ в области потока вашей базы данных на сервере MySQL. Но эти пользовательские переменные не остаются в памяти после закрытия сеанса. Они не являются хорошим способом хранения данных с одного запроса на следующий.

Единственная причина для хранения больших объемов данных в пользовательских переменных заключается в том, что вам необходимо использовать их в последующих SQL-запросах во время одного и того же сеанса db (что означает, что в течение одного и того же запроса PHP), и вы надеетесь избежать передачи этого строка от сервера db к вашему приложению. В противном случае вы можете также получить результат и сохранить его в переменной PHP.

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

Ответ 4

Попытайтесь иметь в виду, что веб-парадигма поощряет модель памяти без состояния. То есть загрузите то, что вам нужно, чтобы отобразить страницу, отобразить страницу и освободить ресурсы.

Очевидно, что есть время для кэширования данных, но да, сохранение информации в переменных сеанса создает больше использования памяти для вашего приложения в целом, а EACH SESSION будет использовать все N байтов, которые вы храните.

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