PHP Sessions - вопросы блокировки и обмена - PullRequest
4 голосов
/ 30 мая 2010

Я хотел бы знать, возможно ли читать атрибуты $ _SESSION, не блокируя его.
В настоящее время session_start() блокирует SESSION, это означает, что другие процессы PHP будут ждать, пока он не будет разблокирован.
Но некоторые процессы просто хотят получить переменные $ _SESSION, а не записывать их.
Возможно ли реализовать какую-то функцию, например session_get(string $id), которая не блокирует SESSION?

Кроме того, можно обмениваться СЕССИЯМИ между браузерами, если пользователь вошел в ту же учетную запись, например, используя session_id('shared_vars_of_'.$userid). Но это безопасно? Это обескураживает?

Спасибо
Нуну

Ответы [ 2 ]

6 голосов
/ 19 января 2013

Лично я делаю это прямо в начале:

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();
4 голосов
/ 30 мая 2010

Интересный вопрос!

session_write_close () не совсем то, что вы просите, но это должно помочь ускорить процесс:

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

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

Обновление: Я только что обнаружил интересную проблему 2001 года в трекере PHP 4 , которая, кажется, представляет патч, разрешающий сеансы только для чтения - похоже, он этого не сделал к официальным релизам, хотя, по крайней мере, не в соответствии с документацией! Может быть, стоит покопаться или открыть Ticket for PHP 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...