Вы действительно не можете использовать обработчик session_destroy, так как он вызывается, только если вы явно вызываете session_destroy, что не произойдет, если пользователь просто закроет свой браузер и завершит сеанс.Так как в этом сценарии нет способа зафиксировать «событие» окончания сеанса, вам придется вместо этого выполнять какую-то периодическую проверку, чтобы увидеть, был ли сеанс бездействующим в течение заданного периода времени.Самый простой способ сделать это - создать в сеансе поле с последним временем доступа, а затем создать скрипт, который периодически (либо через cron, либо запускает некоторые другие функции в ваших PHP-скриптах) проверяет это поле для всех активных сеансов и,для любого, у которого метка времени старше xx секунд, запустите ваш запрос на обновление.
Обратите внимание, что для того, чтобы сделать это, используя стандартные сеансы PHP, которые хранятся в файловой системе, вам нужно будет фактически открыть файлы иразбирать их напрямую.Альтернативой является сохранение сессий в базе данных, но это, вероятно, не то, что вы хотите сделать, учитывая тот факт, что вы пытаетесь уменьшить нагрузку на БД.
Еще одна возможность, которая не совсем так, как разработкаинтенсивность:
- Добавление последней отметки времени к сеансу
- Проверка этой отметки времени при каждом обновлении сеанса
- Если отметка времени старше хх секундзапустите запрос на обновление базы данных и установите временную метку на текущее время.
Таким образом, вы обновляете базу данных очень часто, а не каждую загрузку страницы.Недостатком этого подхода, конечно, является то, что если последнее действие в сеансе не соответствует точно временному интервалу, который вызывает функцию обновления, вы не можете хранить самую актуальную информацию о сеансе в БД.