Назад | Перейти на главную страницу

Есть ли у PHP * * для сериализации / десериализации данных сеанса между каждым HTTP-запросом? Или есть настройка только для сохранения сессий в памяти?

я считать Я понимаю, почему сеансы - это зло, но для быстрого взаимодействия с клиентом я не хочу, чтобы мне приходилось повторно запрашивать базу данных при каждом HTTP-запросе. (Для сравнения: сервлеты Java могут легко хранить в памяти тонны объектов сеанса.)

Можно ли настроить PHP для этого или он должен сериализоваться, потому что он запускается из CGI / FastCGI и, следовательно, по определению является новым процессом каждый раз, когда приходит запрос? Я буду запускать PHP с помощью LAMP.

На самом деле способ обработки сеансов в PHP намного лучше, чем в вашем примере с сервлетом. Позволь мне объяснить.

В PHP (по умолчанию) сеанс представлен файлом в файловой системе. Когда ты звонишь session_start(), он проверяет, существует ли файл, и, если да, загружает его. Если нет, он создает его, а затем блокирует. У этого есть два основных преимущества. Во-первых, это позволяет множеству процессов на одном сервере «совместно использовать» данные сеанса. Во-вторых, если кто-то попытается выполнить DDOS на вашем сайте, данные сеанса не отключат его (ваше узкое место будет в другом месте, вам не нужно беспокоиться о подкачке или нехватке места в памяти, потому что у вас много сеансов).

Методы сериализации / десериализации в php на самом деле довольно эффективны, поскольку они написаны на C и, следовательно, скомпилированы. Так что это не узкое место. Причина, по которой сеансы PHP часто называются evil в том, что они блокируют. Когда вы открываете файл сеанса, он получает эксклюзивную блокировку файла (или блокируется, пока это не будет сделано). Эта блокировка сохраняется до закрытия сеанса (либо до конца скрипта, либо session_write_close(). Это желательно, поскольку предотвращает проблемы параллелизма. Но помните, что если у вас есть длительный запрос и вы попытаетесь сделать еще один во время его выполнения, вы заблокируете.

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

Теперь, что касается вашего «Я не хочу повторно запрашивать базу данных при каждом запросе», я спрашиваю, почему бы и нет? Все, что вы делаете, это простой поиск PK. Если вы действительно не искажаете схему, даже операторы обновления / записи / удаления должны быть ДЕЙСТВИТЕЛЬНО эффективными. Я бы посоветовал использовать таблицу памяти (в MySQL), так как это быстрее, и вы не заботитесь о сохранении данных при перезапуске сервера. Если вас это беспокоит, установите memcached и позвольте ему обрабатывать хранение сеансов (чтобы вам не нужен SQL) ...