Я хотел бы знать, можно ли читать атрибуты $ _SESSION без его блокировки.
В настоящее время session_start()
блокирует SESSION, это означает, что другие процессы PHP будут ждать, пока они не будут разблокированы.
Но некоторые процессы просто хотят получить некоторые переменные $ _SESSION, а не писать на них.
Возможно ли реализовать некоторую функцию типа session_get(string $id)
которая не блокирует SESSION?
Кроме того, можно разделить СЕССИИ между браузерами, как только пользователь будет зарегистрирован в той же учетной записи, например, используя session_id('shared_vars_of_'.$userid)
. Но это безопасно? Это обескураживает?
Благодаря,
Нуно
Интересный вопрос!
session_write_close () не совсем то, о чем вы просите, но это должно ускорить процесс:
Данные сеанса обычно сохраняются после завершения вашего сценария без необходимости вызова session_write_close (), но поскольку данные сеанса заблокированы для предотвращения одновременной записи, только один скрипт может работать в сеансе в любое время. При использовании наборов фреймов вместе с сеансами вы будете наблюдать за загрузкой кадров по одной из-за этой блокировки. Вы можете сократить время, необходимое для загрузки всех кадров, завершив сеанс, как только будут выполнены все изменения в переменных сеанса.
Скрипт, который нуждается только в доступе только для чтения, может начать сеанс, скопировать переменные сеанса в другой массив и применить session_write_close (). Это не будет полностью доступным для чтения решением – возможно, вам нужно будет создать для него собственный обработчик сеанса, но это должен быть большой шаг вперед.
Обновление: я только что нашел интересную проблему с 2001 года в трекер PHP 4, который, похоже, вводит исправление, позволяющее проводить сеансы только для чтения – он, похоже, не попал в официальные выпуски, хотя, по крайней мере, не в соответствии с документацией! Возможно, это стоит того, чтобы копать дальше или снова открывать билет для PHP 5.
Лично я делаю это в самом начале:
session_start(); session_write_close();
И тогда у вас есть доступ к $ _SESSION только для чтения. Как вы можете видеть ниже, вам не нужно копировать переменные сеанса .
session_start(); //This value will be "The #1 Value!" only the 2nd time you run this echo "<br />myData value1:".$_SESSION['myData']; $_SESSION['myData'] = "Value 2 and 3!"; session_write_close(); echo "<br />myData value2 (read-only):".$_SESSION['myData']; $_SESSION['myData'] = "Value 3 Misleading, and never actually written to the session!"; //But it will affect this value, obviously echo "<br />myData value3:".$_SESSION['myData']; session_start(); //NOTE HOW THE ABOVE LINE WRITES-OVER $_SESSION echo "<br />myData value4:".$_SESSION['myData']; $_SESSION['myData'] = "The #1 Value!"; session_write_close();