Есть ли способ выполнить функцию, когда сеансы уничтожены на таймаутом или закрытием браузера?
Да, но это может не сработать, как вы себе представляете. Вы можете определить свой собственный обработчик сеанса, используя session_set_save_handler
, а часть определения включает функции обратного вызова destroy
и gc
. Эти два вызова вызываются, когда сеанс уничтожается явно и когда он уничтожается из-за истечения срока действия, поэтому они делают именно то, что вы просите.
Однако истечение срока действия в связи с таймаутом не происходят с точностью часовой стрелки; это может быть очень много времени, прежде чем истекший сеанс на самом деле «собранный мусором». Кроме того, сборщик мусора запускает probabilistically, поэтому в теории есть вероятность того, что истекшие сессии будут никогда не собирать мусор.
Является ли это чувствительным? Являются ли несколько сотен параллельных SQL-запросов проблемой для общего сервера и идея использования $ _SESSION в качестве буфера, предназначенного для смягчения некоторых из этих проблем.
Я действительно не хотел бы сделать это по нескольким причинам:
- Преждевременная оптимизация (перед измерением, не только предположить, что это будет «лучше»).
- Сессия никогда не может быть собрана мусором; даже если этого не происходит, вы не контролируете , когда их собирают. Это может быть проблемой.
- Существует возможность потерять все, что содержит сессия (например, перезагрузка сервера), которая включает в себя прогресс игрока. Игрокам не нравится проигрывать прогресс.
- Параллельные сеансы для одного и того же пользователя были бы невозможны (чьи «сохраненные данные» выигрывают и остаются в базе данных?).
Что относительно альтернатив?
Ну, поскольку мы говорим об общем хостинге el cheapo, вы определенно не будете контролировать сервер, поэтому все, что связано с расширениями PHP (например, memcached), является условным. Кэширование на стороне базы данных также не собирается летать. Кроме того, нагрузка на ваш сервер будет зависеть от переменных вне вашего контроля, поэтому вы не можете действительно планировать пропускную способность.
В любом случае, я начал с того, что сама база данных была построена оптимально и что код написан таким образом, чтобы минимизировать нагрузку на базу данных (бесплатная производительность просто набрав материал в редакторе).
После этого вы можете ввести кеширование только для чтения: обычно есть много вещей, которые вам нужно отображать, но не намерены изменять. Для данных, которые «почти никогда» не обновляются, кеш сеанса, который вы делаете недействительным, когда вам нужно, может быть простым и очень эффективным улучшением (вы даже можете иметь ложные срабатывания в отношении недействительности, если их не так много в великая схема вещей).
Наконец, вы можете добавить кэширование по запросу (в переменных), если вы беспокоитесь о том, чтобы дважды вытаскивать одни и те же данные из базы данных в течение одного запроса.
Memcache, безусловно, путь, Итл осветлить мокасины больше, чем сеанса хранения/записи. – gorelative
Не оптимизируйте, пока не узнаете, что у вас есть проблема. К тому времени, когда у вас будет достаточно нагрузки, это будет проблемой, ваш хост заставит вас переместиться на ваш выделенный сервер в любом случае. –
Хорошо. Тогда я откажусь от этой идеи. Спасибо, ребята! – Ryan